如何使用emit创建子类时引用通用基类中声明的静态字段?

时间:2011-10-28 17:06:12

标签: .net generics static-members reflection.emit

这是(非常简化的)示例:

public abstract class BaseClass<T> where T : BaseClass<T>
{
    public static SomeOtherClass MyStaticField = new SomeOtherClass(typeof(BaseClass<T>));
}

public sealed class FinalClass : BaseClass<FinalClass>
{
    static FinalClass()
    {
        MyStaticField.SomeProperty = 123;
    }
}

BaseClass用代码编写并编译。我需要在运行时使用Emit创建FinalClass。我设法在Is it possible to emit a type deriving from a generic type while specifying itself as the generic type parameter?中发布了如何讨论它的类。

问题是我在发射时无法引用MyStaticField字段。我尝试过使用TypeBuilder.GetField,但由于我的类型仍处于构建阶段,因此它无法正常工作#34;它还没有最终确定。我尝试使用typeof(BaseClass&lt;&gt;)。MakeGenericType(typeBuildOfFinalClass)但由于同样的原因它没有工作。

当我手动编写代码并反编译时,我看到对BaseClass.MyStaticField的引用,但我无法找到发出它的方法。我不知道如何获得发出操作码函数参数所需的FieldInfo。

有谁知道如何解决这个问题?

THX。

P.S。对于使用emit的任何人......你可能会发现这非常有用(http://www.codeproject.com/KB/msil/emithelper.aspx)。这是一个非常古老的新闻,但如果你不了解它......试试吧:)。

1 个答案:

答案 0 :(得分:1)

您需要使用静态TypeBuilder.GetField方法:

var fieldInfo = TypeBuilder.GetField(typeof(BaseType<>).MakeGenericType(typeBuilderOfFinalClass), typeof(BaseType<>).GetField(...))