クラス ClassWithMember があるとしましょう
class ClassWithMember
{
int myIntMember = 10;
}
System.Type で myIntMember メンバーの既定値 10 を取得するにはどうすればよいですか?
私は現在、クラスのデフォルトメンバー(10)ではなく、int(0)のデフォルト値を取得するだけで、リフレクションに苦労しています。
次のようなことを試すことができます:
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);
}
}
これで、Reflection を使用してデフォルト値を簡単に取得できる状況になりました。
リフレクションの要件により、これはかなり遅くなることに注意してください。したがって、このコードが頻繁にインスタンス化される場合は、おそらく別のアプローチを見つける必要があります。また、.NET Framework の属性サポートの制限により、非値型では機能しません。
Activator.CreateInstance を使用して、MonoBehaviour/ScriptableObject を作成し、その値を確認することができます (単に既定値を確認するためだけの場合)。後で必ず DestroyImmediate を使用してください ;-)