通过反射获取父级的静态字段值

时间:2018-08-02 12:17:00

标签: c# reflection static

我有以下课程

public interface ISomeInterface
{
    void DoThings();
}
public class SomeImplementation1 : ISomeInterface
{
    public void DoThings() { /*..*/ }
}


public class Base
{
    public static ISomeInterface field;
}
public class Derived1 : Base
{
    static Derived1() { field = new SomeImplementation(); }
}


Type derivedType = // retrieve a type derived from Base

FieldInfo fieldInfo = derivedType.GetField("field", BindingFlags.Static | BindingFlags.Public); // is null
ISomeInterface a = (ISomeInterface) fieldInfo.GetValue(null);
a.DoThings();

因此,我想获取在Base中定义但在Derived中设置的静态字段值。同时,我没有对初始化的派生对象的引用,而只有其类型。

当我尝试查找相应的字段信息时,结果为null。据我了解,静态字段绑定到定义它们的类。这就是为什么在给定派生类的情况下我无法获取字段引用的原因。

有没有办法解决这个问题?

某些情况:我与Unity合作。 Class Base是MonoBehaviour,我不想实例化它,因为它会导致性能开销。同时,我想访问一些绑定到其派生类并由ISomeInterface的实现表示的逻辑。

1 个答案:

答案 0 :(得分:0)

derivedType指示的类型没有字段field。这是静态绑定到Base类的。所以你有两个机会

  1. 使用基本类型:

    Type derivedType = // retrieve a type derived from Base
    FieldInfo fieldInfo = derivedType.BaseType.GetField("field", BindingFlags.Static | BindingFlags.Public); // is nul
    
  2. 展平层次结构以从基类中获取所有字段:

    Type derivedType = // retrieve a type derived from Base
    FieldInfo fieldInfo = derivedType.GetField("field", BindingFlags.Static | BindingFlags.Public | BindingFlags.FlattenHierarchy); 
    

除此之外,您无需使用反射,也不需要实例来访问静态字段。这就是static的全部用法。只需使用此:

ISomeInterface a = Base.field;