如何获得基类型的字段值

gdo*_*ica 1 .net c# oop reflection inheritance

我有一个派生自基类的类,它有一个私有字段.如何获取BaseType字段值?

public class SuperClass : BaseClass
{
}

public class BaseClass
{
    private object theField;
}
Run Code Online (Sandbox Code Playgroud)

我有SuperClass实例,代码应该是这样的:

var baseType = super.GetType().BaseType;
var fieldInfo = baseType.GetField("theField", BindingFlags.NonPublic | BindingFlags.Instance);
Run Code Online (Sandbox Code Playgroud)

现在我如何从fieldInfo中获取值?或者我的做法是错的?

And*_*tan 6

使用FieldInfo.GetValue

fieldInfo.GetValue(this)
Run Code Online (Sandbox Code Playgroud)

顺便说一下你不需要super.GetType- 你可以这样做:

this.GetType().BaseType
Run Code Online (Sandbox Code Playgroud)

同样,因为您知道基本类型 - 它可能稍微快一点

typeof(BaseClass).GetField("theField" ....)
Run Code Online (Sandbox Code Playgroud)

更新

this之所以使用,是因为你的问题意味着你写的代码是你写的代码的一部分SuperClass(尽管它不是有效的C#):

var baseType = super.GetType().BaseType; 
Run Code Online (Sandbox Code Playgroud)

如果情况并非如此,并且您有一个实例,SuperClass那么这将做:

var obj = new SuperClass();
var privateValue = typeof(BaseClass).GetField("theField", 
  BindingFlags.NonPublic | BindingFlags.Instance).GetValue(obj);
Run Code Online (Sandbox Code Playgroud)

我实际上强烈建议不要使用obj.GetType().BaseType- 因为如果您选择在SuperClass和之间注入基数,您的反射会立即中断BaseClass; 而使用typeof(BaseClass)不会 - 除非你实际上BaseClassSuperClass继承树中删除.