2008-09-24 7 views
3

En supposant que je n'ai que le nom de classe d'un générique sous la forme de "MyCustomGenericCollection (de MyCustomObjectClass)" et que vous ne connaissez pas l'assembly, quelle est la manière la plus simple de créer une instance de cet objet?Quelle est la meilleure façon d'instancier un générique à partir de son nom?

Si cela aide, je sais que la classe implémente IMyCustomInterface et provient d'un assembly chargé dans l'AppDomain actuel.

Markus Olsson a donné un excellent exemple here, mais je ne vois pas comment l'appliquer aux génériques.

Répondre

7

Une fois l'analyse terminée, utilisez Type.GetType(string) pour obtenir une référence aux types impliqués, puis utilisez Type.MakeGenericType(Type[]) pour construire le type générique spécifique dont vous avez besoin. Ensuite, utilisez Type.GetConstructor(Type[]) pour obtenir une référence à un constructeur pour le type générique spécifique, et enfin appelez ConstructorInfo.Invoke pour obtenir une instance de l'objet.

Type t1 = Type.GetType("MyCustomGenericCollection"); 
Type t2 = Type.GetType("MyCustomObjectClass"); 
Type t3 = t1.MakeGenericType(new Type[] { t2 }); 
ConstructorInfo ci = t3.GetConstructor(Type.EmptyTypes); 
object obj = ci.Invoke(null); 
1

Si vous ne me dérange pas traduire à VB.NET, quelque chose comme cela devrait fonctionner

foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies()) 
{ 
    // find the type of the item 
    Type itemType = assembly.GetType("MyCustomObjectClass", false); 
    // if we didnt find it, go to the next assembly 
    if (itemType == null) 
    { 
     continue; 
    } 
    // Now create a generic type for the collection 
    Type colType = assembly.GetType("MyCusomgGenericCollection").MakeGenericType(itemType);; 

    IMyCustomInterface result = (IMyCustomInterface)Activator.CreateInstance(colType); 
    break; 
} 
Questions connexes