2010-09-24 13 views
9

Bit, bir genel sınıfJenerik Sınıf & Type.GetType() bir bilinmez

public abstract class MyClass<T> : UserControl 
{ 

} 

var ve bu

Type type = Type.GetType("Type From DB as String", true, true); 

gibi bir tipi var ve ben oluşturmak istiyorum ve örnek MyClass'ın türünü kullanarak ... Ama bu işe yaramıyor.

MyClass<type> control = (MyClass<type>)LoadControl("/UsercControl.ascx"); 

herhangi bir fikir ????

+0

Bir IoC kullanırım. Kod sıkı bir döngüde mi? – Luke101

+0

Bunu nasıl yapacağınıza dair herhangi bir fikri var mı? – Andy

cevap

0

Sen yansıma kullanarak yeni nesneler oluşturmak:

type.GetConstructor(new Type[]{}).Invoke(new object[]{}); 
1

Jenerik biraz daha karmaşık bundan daha vardır. Aradığınız şey GetGenericTypeDefinition() ve MakeGenericType() yöntemleridir. sizin genel tür atın (bir örneğinde GetType() çağırarak, ya da typeof (MyClass<Object>) kullanarak bunu elde edebilirsiniz) ve temel, açık genel tür (MyClass<T>) almak için() GetGenericTypeDefinition diyoruz. Ardından, bu türde MakeGenericType() öğesini çağırın ve bir öğe ile bir dizi iletin; Jenerik kapatmak için kullanmak istediğiniz türü. Bu, Activator.CreateInstance() öğesine geçebileceğiniz dinamik olarak keşfedilmiş türünüzle (MyClass<MyType>) kapalı genel bir tür alacaktır. Böyle

14

şey:

Type typeArgument = Type.GetType("Type From DB as String", true, true); 
Type template = typeof(MyClass<>); 
Type genericType = template.MakeGenericType(typeArgument); 
object instance = Activator.CreateInstance(genericType); 

Şimdi kullanım mümkün olmayacak sen T bilmediğimizden, üzerinde yöntemleri çağırmadan açısından MyClass<T> olarak ... ama jenerik olmayan bir taban sınıfı veya arabirimi T gerektirmeyen bazı yöntemlerle tanımlayabilir ve buna yayınlayabilirsiniz. Ya da yansıma yoluyla üzerine yöntemleri çağırırsın.

+0

Benzer kod yazıyordum, ancak sonucu nasıl kullanacağınızdan emin değilim. Yansıma ile sınırlı mısın? (Ah, düşüncelerimi teyit fazla metin eklendi.) –

+0

Kesinlikle size T. türün adını bak biliyorum DO ve göreceksiniz çünkü bir Sınıfım olarak, bu jenerik sınıf adının bir mashup olduğunu kullanabilirsiniz ve parametre türleri. Ancak, benim tipimin (MyClass <>) yasal olduğunu düşünmüyorum; Sonra, bir tür kapatma belirtin) GetGenericTypeDefinition kullanılarak – KeithS

+0

@KeighS, Jon'un kodunu dışarı şerit var ('typeof (Sınıfım <>)') kesinlikle çalışır. Kendin için test et. –