如何为从抽象类派生的受保护属性设置值? C#

问题描述 投票:0回答:1

我有一个从基类派生的类。为了在单元测试中对其进行一些操作,我想通过反射更改一些受保护的属性。但当我尝试这样做时,我有一个

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! });
}
c# system.reflection
1个回答
0
投票

属性不能被调用,不能使用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);
© www.soinside.com 2019 - 2024. All rights reserved.