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.