按字符串获取字段值

时间:2013-05-26 15:22:24

标签: c# reflection

我想通过使用字符串作为变量名来获取对象字段的值。 我尝试用反射做到这一点:

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的对象中获取值TestClass1

3 个答案:

答案 0 :(得分:14)

你已经做了你需要做的一切,你只需要做两次:

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

答案 1 :(得分:4)

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

答案 2 :(得分:4)

您的SubProperty成员实际上是Field而不是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);
    }
}

此类现在允许您从初始类中提取属性,并从第二个属性中获取值,该属性是从第一个属性中提取的。