2013-06-10 12 views
7
[Name("Admin")] 
public class TestAdmin : TestUserBase<TestAdmin> 
{ 
    public TestAdmin(Type webDriverType) : base(webDriverType) 
    { 
    } 
} 

Obecnie mam kilka klas tego formularza, które chciałbym utworzyć w środowisku wykonawczym za pomocą Reflection.Emit. Jednakże, używam do problemu, gdy próbuję dodać rodzica - ponieważ klasa TestAdmin nie istnieje przed wykonywania, nie wiem jak stworzyćUżywanie emitowanego typu jako parametru typu w Reflection.Emit

TestUserBase<TestAdmin> 

pomysłów?

+0

Masz problemy, ponieważ argumentem dla podstawowej klasy ogólnej jest * ta * klasa? –

+0

Wierzę, że masz problem z kurczakiem i jajkiem ... Kompilator C# może być w stanie to zrobić, ponieważ prawdopodobnie nie używa Reflection.Emit do generowania IL. Nie jestem pewien, czy istnieje rozwiązanie tego problemu ... –

+0

Czy make-generic-method akceptuje typ-builder? Właściwie, wydaje mi się, że pamiętam niektóre cierniste obszary z kurczaka/jajka, z którymi wydzielają się zmagania. Ostatnio używam odbicia IKVM, które ma ten sam api co odbicia, ale które naprawia wiele z tych obszarów –

Odpowiedz

7

Można ustawić typ rodzica przy użyciu SetParent:

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

Type theType = tb.CreateType(); 
+0

Awesome, thanks! To wygląda dokładnie tak, jak potrzebuję. –

3

OK. Nie byłem w stanie tego dokładnie przetestować, ale myślę, że jest to możliwe. Spróbuj czegoś takiego:

Zakładając, że rodzajowe klasa bazowa jest już zdefiniowany (czyli nie jesteś generowania TestUserBase<T>), powinieneś być w stanie zrobić coś takiego:

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

oczywiście, jeśli TestUserBase<T> jest generowany, możesz użyć tej samej logiki używając MakeGenericType na dynamicznym typie TestUserBase<T>. Logika SetParent jest taka sama.

Powiązane problemy