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

.net 使用PropertyInfo.GetValue获取没有getter的AutoProperty的值,.net,reflection,propertyinfo,.net,Reflection,Propertyinfo,我试图在单元测试中获取字符串属性的值。问题是该属性没有getter。该属性也声明为自动属性,并且没有支持字段 我试图在System.Reflection命名空间中使用PropertyInfo.GetValue(…)。但是,我获取System.ArgumentException:未找到属性获取方法 我不拥有该类型的代码,因此无法向属性添加getter 如何获得这样一个属性的值?您可能需要找到编译器使用反射自动生成的支持字段。然后,使用它的FieldInfo可以读取它的值。我不确定这是否可能 好的,

我试图在单元测试中获取字符串属性的值。问题是该属性没有getter。该属性也声明为自动属性,并且没有支持字段

我试图在System.Reflection命名空间中使用PropertyInfo.GetValue(…)。但是,我获取System.ArgumentException:未找到属性获取方法

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


如何获得这样一个属性的值?

您可能需要找到编译器使用反射自动生成的支持字段。然后,使用它的
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;
    }
}

属性将有一个支持字段,只是我们不知道它的名称(并且它的名称将不是有效的标识符)。如果这是一个一次性任务,那么您最好使用打开它并找到setter设置的字段


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

你能澄清获取“值”的含义吗对于一个没有getter的属性?至少对我来说,这是没有意义的。顺便说一句,自动实现的属性必须定义一个get和一个set。你确定这不是私有getter而不是没有getter的情况吗?后发代码重现了这个问题。@Ani当然你是非常正确的。我当时很匆忙,因为我们面临时间压力。我将Object Broweser中属性的显示解释为一个Autoproperty,其中只显示PropertyName{set;}为了表明该属性只有一个setter。我在reflector中打开了它,我应该早点打开它,事实上它有一个支持字段,因此实际上很容易获得值。非常感谢decyclone,这是一个非常好的解决方案。但我的问题是错的。结果是该属性确实有一个支持字段,但我没有看到了。你发布的精彩解决方案。它确实帮助我快速解决了问题。感谢你的努力,并为我最初的错误道歉。
TestClass obj = new TestClass() { TestProperty = "Test Value" };
Object value = obj.GetPropertyValue("TestProperty"); // value = "Test Value"