我正在尝试在单元测试中获取字符串属性的值。问题是该属性没有吸气剂。该属性也被声明为 AutoProperty,并且没有支持字段。
我正在尝试在 System.Reflection 命名空间中使用 PropertyInfo.GetValue(...) 。但是我得到 System.ArgumentException : Property Get 方法没有找到。
我不拥有该类型的代码,因此我无法向该属性添加吸气剂。
如何获得这样一个财产的价值?
我正在尝试在单元测试中获取字符串属性的值。问题是该属性没有吸气剂。该属性也被声明为 AutoProperty,并且没有支持字段。
我正在尝试在 System.Reflection 命名空间中使用 PropertyInfo.GetValue(...) 。但是我得到 System.ArgumentException : Property Get 方法没有找到。
我不拥有该类型的代码,因此我无法向该属性添加吸气剂。
如何获得这样一个财产的价值?
您将不知何故需要找到由编译器使用反射自动生成的支持字段。然后,使用它,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"
该属性将有一个支持字段,只是我们不知道它的名称(并且它的名称不是有效的标识符)。如果这是一次性任务,那么您最好使用.NET 反射器将其打开并找到由 setter 设置的字段。
我认为您无法通过反射做任何事情(除非您想解析 setter 的 IL 方法主体以查找它正在设置的字段