Получить значение по умолчанию для члена класса - PullRequest
5 голосов
/ 07 июня 2010

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

class ClassWithMember
{
    int myIntMember = 10;
}

Как мне получить значение по умолчанию 10 члена myIntMember по System.Type?

В настоящее время я борюсь с отражениямиПо всем данным, это значение по умолчанию для int (0), а не член по умолчанию для классов (10) ..

Ответы [ 4 ]

5 голосов
/ 07 июня 2010

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

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

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

3 голосов
/ 07 июня 2010

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

2 голосов
/ 07 июня 2010

Если вы управляете кодом для 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.

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

0 голосов
/ 17 августа 2018

Вы все еще можете использовать Activator.CreateInstance для создания MonoBehaviour / ScriptableObject и проверки его значений, если это просто ради проверки значений по умолчанию. Обязательно используйте DestroyImmediate впоследствии; -)

...