您的SubProperty
成员实际上是 aField
而不是 a Property
,这就是为什么您无法使用该GetProperty(string)
方法访问它的原因。在您当前的场景中,您应该使用以下类首先获取SubProperty
字段,然后获取Address
属性。
此类将允许您通过关闭T
具有适当类型的类型来指定属性的返回类型。然后,您只需将要提取其成员的对象添加到第一个参数中。第二个参数是您要提取的字段的名称,而第三个参数是您要获取其值的属性的名称。
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);
}
}
此类现在将允许您从初始类中提取属性,并从从第一个属性中提取的第二个属性中获取值。