2009-10-20 7 views
4

J'ai besoin d'une solution pour charger des listes d'objets - des recherches où une seule propriété est référencée à partir de l'objet actuel comme dans cet exemple.Méthode générique avec un type non spécifié possible?

class LookupObjectAddress 
{ 
[...] 
public string City 
{ get; set; } 
[...] 
} 

class WorkingObject 
{ 
// references the property from LookupObjectAddress 
public string City 
{ get; set; } 
} 

Pour la recherche je besoin d'une liste à charger à partir de la base de données, à savoir d'où charger les informations que j'utilise un attribut

class WorkingObject 
{ 
// references the property from LookupObjectAddress 
[Lookup(Type=typeof(LookupObjectAddress), staticloaderclass="LookupObjLoader", staticloaderMethod="LookupObjLoadMethod")] 
public string City 
{ get; set; } 
} 

Après avoir lu le PropertyInfo pour le WorkingObject.City Propriété Je connais le type de l'objet de recherche, et de quelle classe avec quelle méthode le charger. Maintenant, j'ai besoin du pont pour obtenir une liste avec ces trois paramètres à travailler.

Type loaderClass = Type.GetType(classname); 
MethodInfo loaderMethod = loaderClass.GetMethod(loadmethod); 
object objList = loaderMethod.Invoke(null, new object[] {}); 

Depuis que je besoin de la liste dactylographiée <> pour l'utilisation des propriétés des LookupObjects sur l'interface utilisateur, comment puis-je devenir une liste utilisable dans le code?

Mon résultat idéal serait, si je pouvais taper:

var list = Loader.Load(type, "LookupObjLoader", "LookupObjLoadMethod"); 

où les paramètres sont lus à partir de l'attribut. (.-À-dire pas connu à la compilation)

+1

Je ne comprends pas vraiment votre question. Voulez-vous dire que loaderMethod.Invoke() devrait retourner une liste à la place? – GenericTypeTea

+0

Pouvez-vous écrire du code qui est votre résultat idéal? – GenericTypeTea

+0

C'est vrai, pour fonctionner correctement avec la liste, il faudrait que je connaisse le type de la liste. Mais je veux que le UserControl pour cela soit aussi générique que possible et pas avec des Cases pour chaque ObjectType que j'ai comme Lookup possible. –

Répondre

5

Afin de produire un type List<T>, et donc par exemple, lors de l'exécution, où T provient d'un objet Type, vous feriez ceci:

Type genericListType = typeof(List<>); // yes, this really is legal syntax 
Type elementType = ... 
Type specificListType = genericListType.MakeGenericType(elementType); 
// specificListType now corresponds to List<T> where T is the same type 
// as elementType 
IList list = (IList)Activator.CreateInstance(specificListType); 

Cette produira, au moment de l'exécution, le type de liste correct et le stockera dans la variable list.

Notez qu'il n'y a aucun moyen que vous pouvez obtenir le compilateur de déduire le type de variable, donc ceci:

var list = Loader.Load(...) 

ne produit toujours pas un List<T>de type, il devra utiliser un non générique , connu au moment de la compilation pour stocker la liste, comme IList, mais l'objet que vous y stockez peut être un objet générique, produit de la manière que je décris ci-dessus.

+0

Cela devrait faire. Merci pour cela. –

Questions connexes