我试图在单元测试中获取字符串属性的值。问题是该物业没有吸气剂。该属性也声明为AutoProperty,没有后备字段。
我正在尝试在System.Reflection命名空间中使用PropertyInfo.GetValue(...)。但是我收到System.ArgumentException:找不到属性Get方法。
我不拥有该类型的代码,因此我无法在属性中添加getter。
如何获得此类财产的价值?
答案 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方法体以找到它所设置的字段