2009-12-21 8 views
5

est-il possible d'appeler avec réflexion une méthode avec "argument de type explicite" <S> définition
par exemple. oObject.Cast<S>()?Comment appeler une méthode générique par réflexion

où est:

IList <P> oObject = new List <P>(); 

J'ai essayé avec

oObject.getType().InvokeMember("Cast", BindingFlags.InvokeMethod, null, oObject, null) 

mais il ne fonctionne pas, personne ne sait pourquoi?


Voici le code de test complet, mais cela ne fonctionne toujours pas. La dernière ligne produit toujours l'exception. Est-il possible de le faire fonctionner?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Reflection; 

namespace reflection_tester 
{ 
    class CBase 
    { 
     public string Ja = "I am the base"; 
    } 

    class MyClass01 : CBase 
    { 
     public string _ID; 

     public string ID 
     { 
      get { return _ID; } 
      set { _ID = value; } 
     } 
    } 

    class Program 
    { 

     public static object wrapper() 
     { 
      //return a list of classes MyClass01 

      IList<MyClass01> lstClass01 = new List<MyClass01>(); 

      MyClass01 oClass01a = new MyClass01(); 
      oClass01a.ID = "1"; 

      MyClass01 oClass01b = new MyClass01(); 
      oClass01b.ID = "2"; 

      lstClass01.Add(oClass01a); 
      lstClass01.Add(oClass01b); 

      return lstClass01; 
     } 

     static void Main(string[] args) 
     { 

      MyClass01 oMy1 = new MyClass01(); 
      oMy1._ID = "1"; 

      MyClass01 oMy2 = new MyClass01(); 
      oMy2._ID = "3"; 

      IList<MyClass01> oListType01 = new List<MyClass01>(); 

      oListType01.Add(oMy1); 
      oListType01.Add(oMy2); 

      object oObjectType = new object(); 

      oObjectType = oListType01; 

      /* this works */ 
      IEnumerable<CBase> enumList = oListType01.Cast<CBase>(); 

      MethodInfo mInfo = typeof(System.Linq.Enumerable).GetMethod("Cast", new[] { typeof(System.Collections.IEnumerable) }).MakeGenericMethod(typeof(CBase)); 

      /* this does not work, why ? throws exception */ 
      IEnumerable<CBase> enumThroughObject = (IEnumerable<CBase>)mInfo.Invoke(oObjectType, null); 

      return; 
     } 
    } 
} 

Répondre

13

La méthode d'extension Cast vit la classe Enumerable, et vous avez besoin d'appeler MakeGenericMethod:

typeof(System.Linq.Enumerable) 
    .GetMethod("Cast", new []{typeof(System.Collections.IEnumerable)}) 
    .MakeGenericMethod(typeof(S)) 
    .Invoke(null, new object[] { oObjectType }) 

mise à jour: Parce que la méthode est statique, le premier paramètre à Invoke doit être null

+0

Invoke fonction ne prend pas un paramètre, donc si je mets le second paramètre comme "nul", je reçois une exception. aucune idée pourquoi? – milan

+0

L'exception est: Nombre de paramètres non valide. – milan

+0

'Enumerable.Cast ()' ne prend aucun "argument". L'argument donné dans ce cas est l'objet que vous voulez appeler la méthode d'extension Cast. – user7116

0

Je pense que vous cherchez Type.MakeGenericType

+2

Je suis désolé mais je ne comprends pas D une si courte explication, pourriez-vous s'il vous plaît écrire du code afin de mieux le comprendre? – milan

Questions connexes