0

我正在尝试在单元测试中获取字符串属性的值。问题是该属性没有吸气剂。该属性也被声明为 AutoProperty,并且没有支持字段。

我正在尝试在 System.Reflection 命名空间中使用 PropertyInfo.GetValue(...) 。但是我得到 System.ArgumentException : Property Get 方法没有找到。

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

如何获得这样一个财产的价值?

4

2 回答 2

1

您将不知何故需要找到由编译器使用反射自动生成的支持字段。然后,使用它,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"
于 2011-02-11T13:19:23.793 回答
0

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

我认为您无法通过反射做任何事情(除非您想解析 setter 的 IL 方法主体以查找它正在设置的字段

于 2011-02-11T13:20:45.430 回答