2010-10-08 96 views
4

我想反映派生类型中的字段,但它返回基类型为 的字段。派生类型的GetFields

public class basetype 
{ 
    string basevar; 
} 

public class derivedtype : basetype 
{ 
    string derivedvar; 
} 

在一些功能:

derivedtype derived = new derivedtype(); 

FieldInfo[] fields = derived.GetType().GetFields(); 

这将返回basevar,但不derivedvar。我试过所有不同的绑定,它似乎没有什么区别。

此外,我在App_Code中的ASP.NET中执行此操作,其中basevar在App_Code中定义,而derivedvar是在App_Controls中定义的用户控件,其中类型不在范围内。

+1

您的代码工作对我来说(我看'derivedvar'),一旦我做了场公众揭露他们到'GetFields()'。你确定你的类层次吗?您是否在独立项目中尝试过上述代码? – 2010-10-08 02:23:27

+1

在上面的代码中,'derivedtype'甚至不是从'basetype'派生的,所以你只能看到'derivedvar'(带有BindingFlags.NonPublic),而不能'basevar'。 – dtb 2010-10-08 02:30:40

+0

@dtb:我错过了。只要适当地推导就可以了;相同的结果。 – 2010-10-08 02:32:53

回答

7

就这样,这将不会返回任何内容,因为默认绑定仅适用于公共字段。

也如,derivedtype不是从基本类型

衍生有了:

FieldInfo[] fields = derived.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance); 

它返回derivedvar。我刚刚检查了LINQPad。

如果我改变derivedtype从基类型导出,然后我可以得到这两个领域有:

FieldInfo[] fields = derived.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance).Concat(derived.GetType().BaseType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance)).ToArray(); 
+0

就是这样,我试图让私人成员也是如此,但是直到我将成员私人化之前,我无法实现它。愚蠢的监督我的部分人,对不起。 – KenEucker 2010-10-08 04:20:48

2

反射有点奇怪。

如果成员是公开的,则所有成员都是可见的。

如果成员是非公开的,则必须指定BindingFlags.NonPublic,并且只会获得那些使用类型的成员。继承的成员不可见。如果你想看到一个类型的所有非公开成员,你必须走上继承链。

+0

这并不“奇怪”,但它究竟应该如何。想象一下,除了基类中私有字段的名称之外,您可以在派生类中为字段赋予任何名称。那么私人领域就不再是私人领域了。 – dtb 2010-10-08 02:45:31

+0

纠正我,如果我错了,但我认为你在这里误解了这个问题。我的问题是尝试获取派生成员,它已经从基类返回继承成员,但不返回派生类中的任何成员。我尝试了BindingFlags.NonPublic,但它也没有工作。 – KenEucker 2010-10-08 03:16:00

+0

@ Epic720:正如我上面提到的那样,我怀疑你的类层次结构并不像你所描述的那样(事实上它不可能是这样 - 在你的例子中显示的两个类别甚至不相互关联!)。你能否将你真实的层次转化为你可以发布的东西? – 2010-10-08 03:21:19