[英]typeof() works, GetType() doesn't works when retrieving property
I am trying to retrieve a value of private
property via reflection 我试图通过反射检索private
财产的价值
// definition
public class Base
{
private bool Test { get { return true; } }
}
public class A: Base {}
public class B: Base {}
// now
object obj = new A(); // or new B()
// works
var test1 = typeof(Base).GetProperty("Test", BindingFlags.Instance | BindingFlags.NonPublic);
if(test1 != null) // it's not null
if((bool)test1.GetValue(obj, null)) // it's true
...
// doesn't works!
var test2 = obj.GetType().GetProperty("Test", BindingFlags.Instance | BindingFlags.NonPublic);
if(test2 != null) // is null !
...
Where is my mistake? 我的错误在哪里? I will need to use object
to pass instance, because some of private
properties will be declared in the A
or B
. 我将需要使用object
来传递实例,因为一些private
属性将在A
或B
声明。 And even hiding (with new
) Base
properties sometimes. 甚至有时隐藏(使用new
) Base
属性。
Test is private to Base. 测试对Base是私有的。 It is not visible to the inherited A/B classes. 它对继承的A / B类不可见。 You should make it protected
if you want it visible to the inheriting class. 如果您希望继承类可以看到它,则应该使其protected
。
Or you can use GetType().BaseType
if the inheritance tree is just one level. 或者,如果继承树只是一个级别,则可以使用GetType().BaseType
。
public class Base
{
private bool Test { get { return true; } }
protected bool Test2 { get { return true; } }
}
public class A : Base { }
public class B : Base { }
[TestMethod]
public void _Test()
{
object obj = new A(); // or new B()
Assert.IsNotNull(typeof(Base).GetProperty("Test", BindingFlags.Instance | BindingFlags.NonPublic));
Assert.IsNotNull(typeof(Base).GetProperty("Test2", BindingFlags.Instance | BindingFlags.NonPublic));
Assert.IsNull(typeof(A).GetProperty("Test", BindingFlags.Instance | BindingFlags.NonPublic));
Assert.IsNotNull(typeof(A).GetProperty("Test2", BindingFlags.Instance | BindingFlags.NonPublic));
Assert.IsNull(typeof(A).GetProperty("Test", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy));
Assert.IsNotNull(typeof(A).GetProperty("Test2", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy));
Assert.IsNull(obj.GetType().GetProperty("Test", BindingFlags.Instance | BindingFlags.NonPublic));
Assert.IsNotNull(obj.GetType().GetProperty("Test2", BindingFlags.Instance | BindingFlags.NonPublic));
Assert.IsNotNull(obj.GetType().BaseType.GetProperty("Test", BindingFlags.Instance | BindingFlags.NonPublic));
Assert.IsNotNull(obj.GetType().BaseType.GetProperty("Test2", BindingFlags.Instance | BindingFlags.NonPublic));
}
A
inherits from Base
, so you need to tell GetProperty
to look for properties in the base class as well. A
继承自Base
,因此您需要告诉GetProperty
在基类中查找属性。 Pass the FlattenHierarchy
flag as well: 传递FlattenHierarchy
标志:
GetProperty("Test", BindingFlags.Instance
| BindingFlags.NonPublic
| BindingFlags.FlattenHeirarchy)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.