6

假设我有一个类 ClassWithMember

class ClassWithMember
{
    int myIntMember = 10;
}

如何通过 System.Type 获取 myIntMember 成员的默认值 10?

我目前正在努力解决所有我检索的反射是int(0)的默认值而不是类默认成员(10)..

4

4 回答 4

5

你可以尝试这样的事情:

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

这里的技巧是实例化一个实例。

于 2010-06-07T14:00:05.920 回答
4

尝试创建一个实例并通过反射检索值。

于 2010-06-07T13:57:22.403 回答
2

如果您可以控制 ClassWithMember 的代码,则可以通过使用[DefaultValue]from 的属性采取完全不同的方法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);
    }
}

所以现在,您可以使用反射轻松检索默认值。

请记住,由于反射要求,这会慢很多,所以如果这段代码被实例化了很多,你可能想找到一种不同的方法。此外,由于 .NET Framework 的属性支持的限制,它不适用于非值类型。

于 2010-06-07T14:12:31.480 回答
0

如果只是为了检查默认值,您仍然可以使用 Activator.CreateInstance 创建 MonoBehaviour/ScriptableObject 并检查其值。确保之后使用 DestroyImmediate ;-)

于 2018-08-17T14:27:08.020 回答