c# - 如何获取基类型字段的值

标签 c# .net oop inheritance reflection

我有一个派生自具有私有(private)字段的基类的类。 如何获取 BaseType 字段值?

public class SuperClass : BaseClass
{
}

public class BaseClass
{
    private object theField;
}

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

var baseType = super.GetType().BaseType;
var fieldInfo = baseType.GetField("theField", BindingFlags.NonPublic | BindingFlags.Instance);

现在如何从 fieldInfo 中获取值?还是我的做法不对?

最佳答案

使用FieldInfo.GetValue

fieldInfo.GetValue(this)

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

this.GetType().BaseType

同样,由于您知道基本类型 - 这样做可能稍微快一些

typeof(BaseClass).GetField("theField" ....)

更新

我使用 this 因为你的问题暗示你写的代码是 SuperClass 的一部分,因为你已经写了(尽管它不是有效的 C#):

var baseType = super.GetType().BaseType; 

如果不是这种情况,并且您有一个 SuperClass 的实例,那么这将执行:

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

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

关于c# - 如何获取基类型字段的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8800667/

相关文章:

c# - 后台线程的预期 ThreadAbort

.net - 用于 .net 远程处理的 GenuineChannels 的良好替代方案

php - 在 php 中使用 Decorator 的完整继承行为

c++ - 类方法读取同一个变量的不同值 C++

c# - 'T' 不包含 'Foo' 的定义,最佳扩展方法重载需要类型为 'IType' 的接收器

c# - asp.net 成员(member)创建用户错误

c# - 我可以将 Activator.CreateInstance 与接口(interface)一起使用吗?

C++ 传递结构化内容的方式?

c# - Puppeteer 启动后软件卡住

.net - 错误1编译时无法复制文件