2013-05-26 17 views
12

変数名として文字列を使用してオブジェクトのフィールドの値を取得したいとします。 私は反射でこれを実行しようとしました:これは完璧に動作文字列でフィールドの値を取得

myobject.GetType().GetProperty("Propertyname").GetValue(myobject, null); 

が、今、私は、「サブプロパティ」の値を取得したい:ここ

public class TestClass1 
{ 
    public string Name { get; set; } 
    public TestClass2 SubProperty = new TestClass2(); 
} 

public class TestClass2 
{ 
    public string Address { get; set; } 
} 

私は値Addressからを取得したいですのオブジェクトです。

答えて

10

あなたはすでにあなたがする必要があるすべてをした、あなたは2回だけそれをしなければならない。

TestClass1 myobject = ...; 
// get SubProperty from TestClass1 
TestClass2 subproperty = (TestClass2) myobject.GetType() 
    .GetProperty("SubProperty") 
    .GetValue(myobject, null); 
// get Address from TestClass2 
string address = (string) subproperty.GetType() 
    .GetProperty("Address") 
    .GetValue(subproperty, null); 
3

あなたSubPropertyメンバーはつまり、実際にFieldないPropertyある

myobject.GetType().GetProperty("SubProperty").GetValue(myobject, null) 
.GetType().GetProperty("Address") 
.GetValue(myobject.GetType().GetProperty("SubProperty").GetValue(myobject, null), null); 
2

を試してみてくださいGetProperty(string)メソッドを使用してアクセスできない理由現在のシナリオでは、次のクラスを使用して最初にSubPropertyフィールドを取得し、次にAddressプロパティを取得する必要があります。

このクラスでは、適切なタイプのタイプTを閉じることで、プロパティの戻り値の型を指定できます。次に、最初のパラメータに、オブジェクトのメンバーを抽出するだけです。 2番目のパラメータは抽出するフィールドの名前で、3番目のパラメータは値を取得しようとしているプロパティの名前です。

class SubMember<T> 
{ 
    public T Value { get; set; } 

    public SubMember(object source, string field, string property) 
    { 
     var fieldValue = source.GetType() 
           .GetField(field) 
           .GetValue(source); 

     Value = (T)fieldValue.GetType() 
          .GetProperty(property) 
          .GetValue(fieldValue, null); 
    } 
} 

コンテキスト内で目的の値を取得するには、次のコード行を実行します。

class Program 
{ 
    static void Main() 
    { 
     var t1 = new TestClass1(); 

     Console.WriteLine(new SubMember<string>(t1, "SubProperty", "Address").Value);    
    } 
} 

これにより、Addressプロパティに含まれる値が得られます。最初に前記のプロパティに値を追加してください。

実際にクラスのフィールドをプロパティに変更する必要がある場合は、元のSubMemberクラスに次の変更を加える必要があります。

class SubMemberModified<T> 
{ 
    public T Value { get; set; } 

    public SubMemberModified(object source, string property1, string property2) 
    { 
     var propertyValue = source.GetType() 
            .GetProperty(property1) 
            .GetValue(source, null); 

     Value = (T)propertyValue.GetType() 
           .GetProperty(property2) 
           .GetValue(propertyValue, null); 
    } 
} 

このクラスでは、今、あなたはあなたの最初のクラスからプロパティを抽出し、第一の特性から抽出された第二の特性、から値を取得できるようになります。

関連する問題