【发布时间】:2015-08-24 14:08:40
【问题描述】:
【问题讨论】:
-
您能准确地发布您尝试过的内容以及出错的地方吗? (代码不是截图)
-
不得不绕过可访问性修饰符通常是糟糕设计的标志。你想做什么,为什么?这是用于自动化测试还是什么?
标签: c# dictionary
【问题讨论】:
标签: c# dictionary
要访问 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
【讨论】:
.GetType() 而不是typeof 运算符?请注意,这会使您的示例或至少部分与抽象、通用和静态类不兼容
是的,这可以通过反射实现。
但是,为了查找非公共成员,您需要使用带有BindingFlags 参数的反射重载。为了查找private 成员,您还需要通过基类typeof 访问,即使使用BindingFlags.FlattenHierarchy。这也意味着您需要使用精确绑定,但请注意,矛盾的标志(例如同时使用 NonPublic 和 Public)是有效的,并且会在此时返回。
请注意,查找非公共成员的非常需要可能被视为代码异味,您应该非常谨慎地这样做。另请注意,不保证非公共成员在不同版本中具有相同的名称。
【讨论】: