【发布时间】:2012-01-23 19:46:54
【问题描述】:
我正在尝试在 BaseClass 类型的变量上设置私有“可见”字段。
- 子类
- 基类
- “可见”字段
- 基类
我已经成功访问了 ChildClass 类型的变量,以及 BaseClass 上“可见”字段的 FieldInfo。
但是当我尝试设置/获取字段的值时,我收到错误 System.Runtime.Remoting.RemotingException: Remoting cannot find field 'visible' on type 'BaseClass'。
那么有没有办法将 ChildClass 类型的变量“向下转换”为 BaseClass 以使反射起作用?
编辑:我正在使用的确切代码:
// get the varible
PropertyInfo pi = overwin.GetProperty("Subject", BindingFlags.Instance|BindingFlags.Public);
CalcScene scene = (CalcScene) pi.GetValue(inwin, null);
// <<< scene IS ACTUALLY A TYPE OF DisplayScene, WHICH INHERITS FROM CalcScene
// get the 'visible' field
Type calScene = typeof(CalcScene);
FieldInfo calVisible = calScene.GetField("visible",BindingFlags.Instance|BindingFlags.NonPublic);
// set the value
calVisible.SetValue(scene, true); // <<< CANNOT FIND FIELD AT THIS POINT
确切的类结构:
class CalcScene
{
private bool visible;
}
class DisplayScene : CalcScene
{
}
【问题讨论】:
-
你能发布你的类的定义,以及你正在使用的反射代码吗?
-
您似乎将问题中的“财产”和“领域”这两个术语混为一谈。你确定你在寻找正确的东西吗?
-
您在问题中混合了术语字段和属性。它们是不同的概念,反射提供了不同的方法来访问它们的定义(例如 GetProperties() 与 GetFields())。我的猜测是您的可见字段实际上被定义为属性。
-
如果你有一个 CalcScene 的实例,为什么不创建一个公共的 Visible 属性并且不使用反射?
-
@jrummell - 我正在使用反射来编辑我正在使用的第 3 方组件中的值。所以我显然不能更改源代码!
标签: c# .net reflection types casting