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.
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 .) –
La question était incomplète, je la répare. Merci pour votre avis. –