Пишу array-like класс, так что хотелось бы, чтобы процесс инициализации экземпляра моего класса был максимально приближен к привычной инициализации массивов
Право есть такая загвоздка:
Мы можем установить значения массива сразу, в фигурных скобках:
int[] a = new int[] { 1, 2, 3 };
Чтобы реализовать подобное поведение в пользовательском классе, необходимо реализовать метод Add, тогда такой код:
MyClass my = new MyClass() { 1, 2, 3 };
Будет на деле развернут в
MyClass my = new MyClass();
my.Add(1);
my.Add(2);
my.Add(3);
Но, как я уже сказал, для этого потребуется делать публичный метод Add, чего хотелось бы избежать, так как он не соотносится с логикой класса
Пока что вижу один вариант решения проблемы:
Создать метод Add, но добавить к нему атрибут BrowsableAttribute(false), чтобы простые пользователи по крайней мере не видели его в списке доступных
Однако, возможно, есть более элегантное решение, о наличии которого я бы и хотел спросить у вас
От BrowsableAttribute мало толку, он вообще похоже не имеет никакого эффекта. Используйте хотя бы EditorBrowsableAttribute, который убирает метод из IntelliSence, если класс расположен в другой сборке. Ну а лучше, если вам нужен компактный синтаксис создания класса на основе массива, просто переопределить оператор преобразования:
public class MyClass
{
List<int> values = new List<int>();
public static implicit operator MyClass(int[] args)
{
MyClass x = new MyClass();
foreach (var item in args) x.values.Add(item);
return x;
}
}
public void Test()
{
MyClass my = new[] { 1, 2, 3 };
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей