这是(非常简化的)示例:
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)。这是一个非常古老的新闻,但如果你不了解它......试试吧:)。
答案 0 :(得分:1)
您需要使用静态TypeBuilder.GetField
方法:
var fieldInfo = TypeBuilder.GetField(typeof(BaseType<>).MakeGenericType(typeBuilderOfFinalClass), typeof(BaseType<>).GetField(...))