2013-05-26 25 views
12

Bir nesnenin alan değerini, bir değişken olarak bir dize kullanarak almak istiyorum. Ben yansıması ile bunu çalıştı: Bu mükemmel çalışıyorDize ile alan değerini al

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

ama şimdi "alt özellik" değerini almak istiyorum: Burada

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

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

ben değerini Address almak istiyorum TestClass1 bir nesne. Zaten yapmanız gereken her şeyi yaptım

cevap

10

, sadece iki kez yapmak zorunda:

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

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

Sizin SubProperty üyesi aslında bir Field ve bir Property olduğunu denemek, yani Neden GetProperty(string) yöntemini kullanarak erişemiyorsunuz. Geçerli senaryonuzda, önce SubProperty alanını ve ardından Address özelliğini almak için aşağıdaki sınıfı kullanmalısınız.

Bu sınıf, uygun türdeki T türünü kapatarak mülkünüzün dönüş türünü belirtmenize izin verir. Ardından, üyeleriniz ayıkladığınız ilk nesnesine ilk parametresini eklemeniz gerekir. İkinci parametre, ayıklamakta olduğunuz alanın adıdır, üçüncü parametre ise değeri almaya çalıştığınız mülkün adıdır.

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); 
    } 
} 

Bağlamınızda istenen değeri elde etmek için, aşağıdaki kod satırlarını uygulamanız yeterlidir.

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

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

Bu size Address özelliğinde bulunan değeri verecektir. Sadece söz konusu mülke bir değer eklediğinizden emin olun.

Ancak sınıfınızın alanını bir özellik olarak değiştirmek istediğinizde, orijinal SubMember sınıfına aşağıdaki değişikliği yapmalısınız.

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); 
    } 
} 

Bu sınıf artık başlangıçtaki sınıfından özelliği ayıklamak ve ilk özelliğinden ayıklanır ikinci özelliği, gelen değeri elde sağlayacaktır.

İlgili konular