在Reflection.Emit中使用发射类型作为类型参数

时间:2013-06-10 21:08:26

标签: c# generics reflection.emit

[Name("Admin")]
public class TestAdmin : TestUserBase<TestAdmin>
{
    public TestAdmin(Type webDriverType) : base(webDriverType)
    {
    }
}

目前,我有一堆这种形式的类,我想在运行时使用Reflection.Emit创建。但是,当我尝试添加父项时,我遇到了一个问题 - 因为TestAdmin类在运行时之前不存在,我不知道如何创建

TestUserBase<TestAdmin>

有什么想法吗?

2 个答案:

答案 0 :(得分:7)

您可以使用SetParent设置父类型:

TypeBuilder tb = mb.DefineType("TestAdmin", TypeAttributes.Public);
tb.SetParent(typeof(TestUserBase<>).MakeGenericType(tb));

Type theType = tb.CreateType();

答案 1 :(得分:3)

行。我无法彻底测试,但我认为这是可能的。尝试这样的事情:

假设您的通用基类已经定义(即,您没有生成TestUserBase<T>),您应该可以执行以下操作:

var emittedType = module.DefineType("TestAdmin", TypeAttributes.Public | TypeAttributes.Class);
var baseType = typeof(TestUserBase<>).MakeGenericType(type);
emittedType.SetParent(baseType);

当然,如果开始生成TestUserBase<T>,您可以在动态类型MakeGenericType上使用TestUserBase<T>使用相同的逻辑。 SetParent逻辑是相同的。