Инициализация в духе массива

182
29 декабря 2018, 18:20

Пишу 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), чтобы простые пользователи по крайней мере не видели его в списке доступных

Однако, возможно, есть более элегантное решение, о наличии которого я бы и хотел спросить у вас

Answer 1

От 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 };                        
}
READ ALSO
Появление строки по истечении времени

Появление строки по истечении времени

Мне нужно чтобы в этом моменте, по истечении, к примеру, 5 секунд появлялось сообщение «Need a clue?»

203
RichTextBox и текст из базы данных

RichTextBox и текст из базы данных

Как реализовать сохранение rtf текста в базу данных и выгрузку его же из бд при помощи RichTextBox или другого элементаВ проекте использую wpf, mvvm

177
Пользовательский textbox

Пользовательский textbox

Код ниже (c# vs2010 winforms net40) определяет пользовательский текстбокс со свойствами "только для чтения" и "скрытым курсором"

237
Как работать с мултитач на Unity?

Как работать с мултитач на Unity?

Например так: нажал на левую сторону экрана - вывелось "Hi", а на правую - "Bye"Когда обе нажал - "Good"

192