![](/img/trans.png)
[英]Dynamic type shadow base class's property and set to protected using Reflection.Emit
[英]Get protected property value of base class using reflection
要访问 ConfigurationId 属性,我使用了以下代码:
SubsetController controller = new SubsetController(new CConfigRepository(new FakeDataContextRepository()));
var myBaseClassProtectedProperty=
controller.GetType().BaseType
.GetProperty("CCITenderInfo", BindingFlags.NonPublic | BindingFlags.Instance)
.GetValue(controller);
var myProtectedProperty =
CCITenderInfo.GetType()
.GetProperty("ConfigurationId", BindingFlags.Public | BindingFlags.Instance)
.GetValue(myBaseClassProtectedProperty);
假设以下父类和子类:
class BaseClass
{
private string privateField = "I'm Private";
}
class ChildClass : BaseClass
{
}
您可以使用反射从ChildClass
实例中读取privateField
的值,如下所示:
ChildClass childInstance = new ChildClass();
object privateFieldValue = childInstance.GetType().BaseType
.GetField("privateField", BindingFlags.NonPublic | BindingFlags.Instance)
.GetValue(childInstance);
Console.WriteLine(privateFieldValue); // I'm Private
要添加到这个答案 - 您应该肯定使用 Instance 和 NonPublic 绑定标志,但您还应该确保您实际上是在引用properties而不是fields 。
例如,如果你有
protected string Andrew;
无论您使用什么绑定标志,您都无法通过GetProperty
获得此信息。 为什么 - 因为它是一个字段,而不是一个属性......
要解决此问题,只需将其更改为
protected string Andrew {get;set;}
然后您可以使用 GetProperty 方法。
是的,这可以通过反射实现。
但是,为了查找非公共成员,您需要使用BindingFlags
参数的反射重载。 为了查找private
成员,您还需要通过基类的类型进行访问,即使使用typeof
也是BindingFlags.FlattenHierarchy
。 这也意味着您需要使用确切的绑定,但请注意,矛盾的标志(例如同时使用NonPublic
和Public
)是有效的,并且会在此时返回。
请注意,查找非公共成员的非常需要可能被视为代码异味,您应该非常小心地这样做。 另请注意,不保证非公共成员在不同版本中具有相同的名称。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.