Matt Koster
Matt Koster

Reputation: 219

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?

Upvotes: 7

Views: 225

Answers (2)

Lee
Lee

Reputation: 144126

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();

Upvotes: 7

Michael Gunter
Michael Gunter

Reputation: 12811

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 (i.e., 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.

Upvotes: 3

Related Questions