0

自動プロパティとして定義されている場合、フィールドの値を取得するにはどうすればよいですか?
理由はわかりませんが、このような説明のつかないメソッドが呼び出されたときに初めてこのような単純なタスクに遭遇したのGetValueですが、それは私が望むようには機能せず、通常は元の単純な仕事を行う代わりにあらゆる種類の例外をスローします..

たとえば、いくつかのコード:

Class A
{
   public int Age { get; set;}
}

ここで、リフレクションの後、 A インスタンスのフィールドを FiledInfo[] の構造で保持していると仮定します。
今、私は上記の配列で関連する fieldInfo を見つけました。彼の名前は
{Int32 k__BackingField} で、とにかく奇妙に聞こえます..
int 値を取得するために GetValue() を使用するにはどうすればよいですか? おっしゃるとおり、色々試してみましたが..

編集:( これは部分的に簡略化されたコードです - 怒らないでください)

private static string foo1<T>(T o)
        {
            var type = o.GetType();
            var fields = type.GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);
           ....
            foo(fields);
         }
}

private static void foo(FieldInfo[] fields)  
        {

            foreach (FieldInfo field in fields)
            {

                if (field.FieldType.IsValueType)
                {
                    var fieldNameLength = field.Name.IndexOf(">") - (field.Name.IndexOf("<")+1);
                    var fieldName = field.Name.Substring(field.Name.IndexOf("<")+1, fieldNameLength);
                    var fieldValue = field.ReflectedType.GetProperty(fieldName).GetValue(field.ReflectedType, null)
                }
             }
}
4

2 に答える 2

2
A a = new A() { Age = 33 };
var age = a.GetType().GetProperty("Age").GetValue(a);
于 2012-12-14T20:45:54.447 に答える
1

代わりに、次のようにする必要がありvar fieldValue = field.ReflectedType.GetProperty(fieldName).GetValue(field.ReflectedType, null)ます:var fieldValue = field.GetValue(o, null)のインスタンスを渡す必要があることに注意してくださいo。実際には、LB が投稿したことを実行して、名前でプロパティを見つけるか、名前がわからない場合は、それらを介して列挙する必要があります。myType.GetProperties

プロパティで動作するように変更されたコードは次のとおりです。

private static void foo1<T>(T o)
{
    var type = o.GetType();
    var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);

    foo(properties, o);
}

private static void foo(PropertyInfo[] properties, object o)
{
    foreach (PropertyInfo property in properties)
    {
        if (property.PropertyType.IsValueType)
        {
            var propertyValue = property.GetValue(o, null);
            //do something with the property value?
        }
    }
}

編集: プロパティにゲッターがあることを確認したい場合があります (参照:ゲッターとセッターの両方を持つプロパティのみを見つけるにはどうすればよいですか? )、またはそれが自動プロパティであることを確認することもできます (参照: プロパティがはリフレクション付きの自動実装プロパティですか? ) しかし、これは必ずしもあなたの要件ではなく、おそらくメソッドの適切な使用GetValue法またはリフレクションを使用して型を検査する方法だけだと思います。

編集:フィールドを使用したい場合は、フィールドを使用した同じコードを次に示します。

private static void foo1<T>(T o)
{
    var type = o.GetType();
    var fields = type.GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);

    foo(fields, o);
}

private static void foo(FieldInfo[] fields, object o)
{
    foreach (FieldInfo field in fields)
    {
        if (field.FieldType.IsValueType)
        {
            var fieldValue = field.GetValue(o);
            //do something with the field value?
        }
    }
}
于 2012-12-14T21:01:59.217 に答える