简体   繁体   中英

Using emitted type as type parameter in Reflection.Emit

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

Currently, I have a bunch of classes of this form that I'd like to create at runtime using Reflection.Emit. However, I'm running into an issue when I attempt to add the parent - since the TestAdmin class doesn't exist before runtime, I don't know how to create

TestUserBase<TestAdmin>

Any ideas?

You can set the parent type using SetParent :

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

Type theType = tb.CreateType();

OK. I haven't been able to test this thoroughly, but I think this is possible. Try something like this:

Assuming your generic base class is already defined (ie, you're not generating TestUserBase<T> ), you should be able to do something like this:

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

Of course, if TestUserBase<T> is begin generated, you can use this same logic using MakeGenericType on the dynamic type TestUserBase<T> . The SetParent logic is the same.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM