2012-05-03 8 views
1

J'ai ce domaine:C# Réflexion: Comment utiliser un "objet" comme un "type paramètre"

public class GenClass<T> { } 

public class Type1 { } 

public class Type2 { } 

public class GenType1 : GenClass<Type1> { } 

public class GenType2 : GenClass<Type1> { } 

public class GenType3 : GenClass<Type2> { } 

public class GenType4 : GenClass<string> { } 

public class GenType5 : GenClass<int> { } 

et cette logique:

public class SomeClass { 
    public void Add<T>(GenClass<T> t) { } 
} 

et ce consommateur:

public class Consumer { 
    public void Method() { 
     var some = new SomeClass(); 
     some.Add(new GenType1()); 
     some.Add(new GenType2()); 
     some.Add(new GenType3()); 
     some.Add(new GenType4()); 
     some.Add(new GenType5()); 
    } 
} 

Mais au lieu d'ajouter chaque GenType(n) séparément, je crée une méthode comme celle-ci:

public void AddFromAssembly<TAssembly>(SomeClass some, Type baseType) { 
    var list = typeof(TAssembly).Assembly.GetTypes() 
     .Where(t => baseType.IsAssignableFrom(t) 
      && !baseType.Equals(t)) 
     .ToList(); 
    list.ForEach(type => { 
     var ctor = type.GetConstructor(BindingFlags.Instance | BindingFlags.Public, null, 
             Type.EmptyTypes, null); 
     var obj = ctor.Invoke(new object[] { }); 
     some.Add(obj); //???? 
    }); 
} 

et que vous voulez l'appeler comme ceci:

public class Consumer { 
    public void Method() { 
     var some = new SomeClass(); 
     AddFromAssembly<GenType1>(some, typeof(GenClass<>)); 
    } 
} 

Mais some.Add méthode est une méthode générique et ctor.Invoke méthode renvoie un object. Avez-vous une idée pour résoudre ce problème? Merci d'avance.

MISE À JOUR La question était incomplète, je la répare. Merci pour votre avis.

+0

Quel devrait être le "type" de 'obj'? (Bien que ce ne soit pas une réponse intelligente, j'ai souvent un 'vide X (objet x, type t)' qui est transféré de 'void X (T t) {X (t, typeof (T));}' dans des situations similaires .) –

+0

La question était incomplète, je la répare. Merci pour votre avis. –

Répondre

1

Les paramètres de type à génériques sont un temps de compilation requis et ne peuvent pas être déterminés au moment de l'exécution (à moins que vous ne souhaitiez entrer dans les tracas de créer des définitions de classe à l'exécution).

Ce que vous devrez probablement faire est de créer une deuxième version de la méthode qui est tapée pour "objet" et l'utiliser à la place.

7

Ou faire ceci:

Add<object>(obj); //this will work with T typed as object 

ou:

typeof(Some).GetMethod("Add").MakeGenericMethod(new [] { typeof(obj.GetType()).Invoke(some, new [] { obj }); 

La version de réflexion utilisera le type exact de obj T lors de l'exécution.

+0

La question était incomplète, je la répare. Merci pour votre avis. –

Questions connexes