2010-12-15 61 views
2

Comment puis-je créer une instance d'un type qui hérite de générique, et jeté statiquement à son type de baseExiste-t-il un moyen de ne pas utiliser dynamique lors de l'instanciation d'un type qui hérite de générique?

foreach(Type t in x.ChildType.Assembly.GetTypes()) 
{ 
    if (t.BaseType.IsGenericType) 
    { 
     if (t.BaseType.GetGenericTypeDefinition() == typeof(ClassMapExt<>)) 
     { 
      if (t.BaseType.GetGenericArguments()[0] == x.ChildType) 
      { 
       // t is BonusMap. BonusMap is declared as: 
       // class BonusMap : ClassMapExt<Bonus> 
       dynamic bz = Activator.CreateInstance(t); 

       // the last line is analogous to: 
       // var bz = new BonusMap(); 

       // statically casting it doesn't work 
       // var bz = (ClassMapExt<>) Activator.CreateInstance(t); 

       foreach (IManyToOneMappingProvider imt1 in bz.ExtReference) 

Répondre

2

Normalement, la façon de le faire est d'inclure une API non-générique là (peut-être explicite la mise en oeuvre). Ensuite, vous venez de lancer vers l'interface non générique.

Pas tout à fait la même chose, mais un peu comme:

Type itemType = ...; 
IList list = (IList)Activator.CreateInstance(
    typeof(List<>).MakeGenericType(itemType)); 
list.Add(...);