2009-10-15 8 views
2

J'ai cette fonctionC# question générique

public DataSet Fetch(string EntityName, ObjectParameter[] parameters, int pagesize, int pageindex) 
    { 
     Assembly asm = Assembly.Load("NCR.WO.PLU.ItemEDM"); 
     Type _type = asm.GetTypes().Where(t => t.Name.Equals(EntityName)).ToList().FirstOrDefault(); 

     object obj = Activator.CreateInstance(_type); 

     return DataPortalFetch<???>(parameters, pagesize, pageindex); 
    } 

Comment passer que _type à la partie générique ??

Répondre

7

Vous devez appeler la méthode en utilisant la réflexion. Les génériques sont conçus pour les types connus à la compilation; vous ne connaissez pas le type à la compilation, vous devez donc passer à travers des cerceaux. Ce sera quelque chose le long des lignes de:

MethodInfo method = typeof(WhateverClass).GetMethod("DataPortalFetch"); 
MethodInfo constructed = method.MakeGenericMethod(new Type[] { _type }); 
return constructed.Invoke(this, new object[] {parameters, pagesize, pageindex}); 

Les détails dépendra que ce soit une méthode d'instance ou une méthode statique, que ce soit etc public ou privé - mais les bases sont:

  • Pour obtenir la définition de méthode générique
  • construire une méthode avec le bon type (efficace: passer l'argument de type)
  • Invoke qui a construit la méthode

Vous pouvez mettre en cache la définition de méthode générique dans un champ en lecture seule statique, btw - c'est réutilisable.

+0

Je pense que si vous ne voulez pas utiliser la réflexion, vous pouvez utiliser Action ou Func <> (dans .NET 3.5 et Predicate dans .NET 2.0) paramètres –

+0

@Tuomas: Comment cela aiderait-il si vous avez encore besoin de fournir les arguments de type au moment de l'exécution? –