Получите значение по умолчанию участника класса

Давайте предположим, что у меня есть класс ClassWithMember

class ClassWithMember
{
    int myIntMember = 10;
}

Как я получаю значение по умолчанию 10 из myIntMember участника Системой. Ввести?

Я в настоящее время борюсь вокруг с отражениями всем, что я получаю, значение по умолчанию интервала (0) не участник значения по умолчанию классов (10)..

5
задан Patrick Hofman 28 September 2015 в 15:25
поделиться

3 ответа

Вы можете попробовать что-то вроде этого:

var field = typeof(ClassWithMember).GetField("myIntMember",
    BindingFlags.Instance | BindingFlags.NonPublic);
var value = (int)field.GetValue(new ClassWithMember());

Хитрость здесь в том, чтобы создать экземпляр.

5
ответ дан 13 December 2019 в 22:02
поделиться

Попробуйте создать экземпляр, чтобы получить значение с отражением.

3
ответ дан 13 December 2019 в 22:02
поделиться

Если вы контролируете код ClassWithMember, вы можете использовать совершенно другой подход к этому, используя атрибут [DefaultValue] из System.ComponentModel . По сути, вы должны написать что-то вроде этого:

class ClassWithMember
{
    public ClassWithMember()
    {
        SetDefaultValues();
    }

    [DefaultValue(5)]
    public MyIntMember { get; set; }
}

И затем иметь где-нибудь такую ​​функцию, возможно, в базовом классе:

public void SetDefaultValues()
{
    foreach (PropertyDescriptor prop in TypeDescriptor.GetProperties(this))
    {
        DefaultValueAttribute a = prop.Attributes[typeof(DefaultValueAttribute)] as DefaultValueAttribute;
        if (a == null) 
            continue;
        prop.SetValue(this, a.Value);
    }
}

Итак, теперь у вас есть ситуация, когда вы можете легко получить значения по умолчанию, используя Отражение.

Имейте в виду, что это будет намного медленнее из-за требования Reflection, поэтому, если этот код создается часто, вы, вероятно, захотите найти другой подход. Кроме того, он не будет работать с типами, не являющимися значениями, из-за ограничений, связанных с поддержкой атрибутов .NET Framework.

2
ответ дан 13 December 2019 в 22:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: