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

içinde tür parametresi olarak kullanma Şu anda Reflection.Emit kullanarak çalışma zamanında oluşturmak istediğim bir sürü form var. Ancak, ben üst ekleme girişiminde bir sorun haline çalıştırıyorum - TestAdmin sınıf çalışma zamanı önce varolmadığı, benYayımlanan türünü, Reflection.Emit

TestUserBase<TestAdmin> 

bir fikir oluşturmak için nasıl bilmiyorum?

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

Type theType = tb.CreateType(); 
+0

Özellikle temel genel sınıfa yönelik argüman * bu * sınıfı olduğundan sorun yaşıyor musunuz? –

+0

Tavuk ve yumurta probleminiz olduğuna inanıyorum ... C# derleyicisi bunu yapabilir çünkü muhtemelen IL üretmek için Reflection.Emit kullanmıyor olabilir. Bu soruna bir çözüm bulunup bulunmadığından emin değilim ... –

+0

Make-jeneric-method type-builder'i kabul ediyor mu? Aslında, yine de, mücadele veren bazı dikenli tavuk/yumurta alanlarını hatırlıyorum. Son zamanlarda ben yansıma-emit ile aynı api sahip ama bu alanlarda bir çok düzeltiyor IKVM-yansıma kullanıyorum –

cevap

7

Sen SetParent kullanarak ebeveyn tipini ayarlayabilirsiniz. Bunu iyice test edemedim, ama bunun mümkün olduğunu düşünüyorum. Böyle bir şey deneyin: TestUserBase<T> eğer Tabii

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

:

(yani sen TestUserBase<T> üreten değil) sizin genel taban sınıfı zaten tanımlanır varsayarsak, böyle bir şey yapmak mümkün olmalıdır oluşturuldu, TestUserBase<T> dinamik türünde MakeGenericType kullanarak aynı mantığı kullanabilirsiniz. SetParent mantığı aynıdır.

+0

Harika, teşekkürler! Bu sadece ihtiyacım olana benziyor. –

3

OK:

İlgili konular