C # Создать значение по умолчанию для класса, например, с помощью отражения - PullRequest
0 голосов
/ 23 сентября 2019

Допустим, у меня есть класс A:

public class A 
{
    private int value;
    public A() => value = 0;
    public A(int value) => this.value = value;
}

И у меня есть какой-то метод со списком параметров, где некоторые по умолчанию:

public void SomeMethod(int i, float f, string s = "", A a = null)

Теперь есть некоторыеспособ, например, с помощью размышления, чтобы быть более умным об этом списке параметров?Я хотел бы иметь возможность сделать что-то вроде следующего, поэтому мне не нужно проверять наличие нуля везде:

public void SomeMethod(int i, float f, string s = "", A a = Default) // should use the empty constructor!

Возможно ли это с C #?

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

Вы можете использовать метод перегрузки

public void SomeMethod(A a, int i, float f, string s = "") { }

public void SomeMethod(int i, float f, string s = "")
{
    SomeMethod(new A(), i, f, s);
}
0 голосов
/ 24 сентября 2019

[ЗАКЛЮЧЕНИЕ]

Это невозможно в C #.Оператор default возвращает ноль для всех ссылочных типов, а для типов значений он инициализирует все поля данных с помощью оператора default.Так что в моем случае я могу фактически опустить эту проблему, используя структуру вместо класса:

public struct A 
{
    private int value;
    public A(int value) => this.value = value;
}

public void SomeMethod(int i, float f, string s = "", A a = default)

И тогда входное значение будет a : A{value = 0}.

Общее решение для использованиякласс не существует в C #, так как значения по умолчанию должны быть определены во время компиляции и, следовательно, должны быть константными выражениями.Только допустимые константные выражения в C # являются примитивами, типами значений и строками.

...