使用PropertyInfo.GetValue获取没有getter的AutoProperty的值

时间:2011-02-11 13:03:12

标签: .net reflection propertyinfo

我试图在单元测试中获取字符串属性的值。问题是该物业没有吸气剂。该属性也声明为AutoProperty,没有后备字段。

我正在尝试在System.Reflection命名空间中使用PropertyInfo.GetValue(...)。但是我收到System.ArgumentException:找不到属性Get方法。

我不拥有该类型的代码,因此我无法在属性中添加getter。

如何获得此类财产的价值?

2 个答案:

答案 0 :(得分:1)

您将需要找到使用Reflection通过编译器自动生成的支持字段。然后,使用其FieldInfo,您将能够读取其值。而且我不确定它是否可行。

好的,我有解决方案:

使用以下课程,

public class TestClass
{
    public String TestProperty { private get; set; }
}

以及以下扩展方法

public static class ObjectExtensions
{
    public static Object GetPropertyValue(this Object obj, String propertyName)
    {
        if (obj == null) throw new ArgumentNullException("obj", "`obj` cannot be null");

        var fields = from f in obj.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic)
                     where f.Name.Contains(String.Format("<{0}>", propertyName))
                     select f;

        if (fields.Any())
        {
            return fields.First().GetValue(obj);
        }

        return null;
    }
}

您可以使用以下代码实现您的目标:

TestClass obj = new TestClass() { TestProperty = "Test Value" };
Object value = obj.GetPropertyValue("TestProperty"); // value = "Test Value"

答案 1 :(得分:0)

该属性将有一个支持字段,只是我们不知道它的名称(它的名称将不是有效的标识符)。如果这是一次性任务,那么你可以使用.NET reflector将其打开并查找由setter设置的字段。

我不认为你可以通过Reflection做任何事情(除非你想解析setter的IL方法体以找到它所设置的字段