假设我有一个类 ClassWithMember
class ClassWithMember
{
int myIntMember = 10;
}
如何通过 System.Type 获取 myIntMember 成员的默认值 10?
我目前正在努力解决所有我检索的反射是int(0)的默认值而不是类默认成员(10)..
你可以尝试这样的事情:
var field = typeof(ClassWithMember).GetField("myIntMember",
BindingFlags.Instance | BindingFlags.NonPublic);
var value = (int)field.GetValue(new ClassWithMember());
这里的技巧是实例化一个实例。
尝试创建一个实例并通过反射检索值。
如果您可以控制 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 的属性支持的限制,它不适用于非值类型。
如果只是为了检查默认值,您仍然可以使用 Activator.CreateInstance 创建 MonoBehaviour/ScriptableObject 并检查其值。确保之后使用 DestroyImmediate ;-)