我有一个从基类派生的类。为了在单元测试中对其进行一些操作,我想通过反射更改一些受保护的属性。但当我尝试这样做时,我有一个
System.MissingMethodException
。
namespace FooNamespace
{
public abstract class Foo
{
protected bool SomeProperty { get; set; }
}
}
namespace BarNamespace
{
public class Bar : Foo
{
}
}
private void ChangeTheProtectedProperty()
{
var obj = new BarNamespace.Bar();
var propertyName = "SomeProperty";
var value = true;
Type t = obj.GetType();
if (t.GetProperty(propertyName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance) == null)
throw new ArgumentOutOfRangeException(nameof(propertyName), string.Format("Property {0} was not found in Type {1}", nameof(propertyName), obj.GetType().FullName));
t.InvokeMember(propertyName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.SetProperty | BindingFlags.Instance, null, obj, new object[] { value! });
}
属性不能被调用,不能使用t.InvokeMember。要通过反射将值设置到属性中,请使用 PropertyInfo.SetValue(object obj, object value) 方法:
var obj = new BarNamespace.Bar();
var propertyName = "SomeProperty";
var value = true;
var property = t.GetProperty(propertyName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)
??
throw new ArgumentOutOfRangeException(nameof(propertyName), string.Format("Property {0} was not found in Type {1}", nameof(propertyName), obj.GetType().FullName));
property.SetValue(obj, value);