答案 0 :(得分:8)
假设以下父类和子类:
class BaseClass
{
private string privateField = "I'm Private";
}
class ChildClass : BaseClass
{
}
您可以使用以下反射从privateField
实例中读取ChildClass
的值:
ChildClass childInstance = new ChildClass();
object privateFieldValue = childInstance.GetType().BaseType
.GetField("privateField", BindingFlags.NonPublic | BindingFlags.Instance)
.GetValue(childInstance);
Console.WriteLine(privateFieldValue); // I'm Private
答案 1 :(得分:2)
要访问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);
答案 2 :(得分:1)
是的,这可以通过反思实现。
但是,为了查找非公共成员,您需要使用带有BindingFlags
参数的反射重载。要查找private
个成员,您还需要通过typeof
基类进行访问,即使使用BindingFlags.FlattenHierarchy
也是如此。这也意味着您需要使用精确绑定,但请注意,矛盾标志(例如同时使用NonPublic
和Public
)是有效的,并且将在此时返回。
请注意,需要查找非公开成员可能会被视为代码味道,您应该小心地非常。另请注意,不保证非公开成员在不同版本中具有相同的名称。