2009-12-21 21 views
5

ist es möglich, mit Reflektion eine Methode mit "Explict Typ Argument" <S> Definition
z. oObject.Cast<S>()?So rufen Sie eine generische Methode durch Reflexion

wo ist:

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

Ich habe versucht, mit

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

aber es funktioniert nicht, weiß jemand, warum?


Hier ist der vollständige Testcode, aber es funktioniert immer noch nicht. Die letzte Zeile erzeugt immer Ausnahme. Ist es möglich, dass es funktioniert?

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; 
     } 
    } 
} 

Antwort

13

Die Cast-Erweiterung Methode für die Klasse lebt suchen Enumerable, und Sie müssen Makegenericmethod nennen:

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

Update: Da das Verfahren ist statisch, der erste Parameter zum Aufrufen sollte sein null

+0

Aufrufen Funktion nimmt keinen Parameter so, wenn ich zweiten Parameter als "null" setze, bekomme ich Ausnahme. irgendeinen Hinweis warum? – milan

+0

Ausnahme ist: Ungültige Anzahl von Parametern. – milan

+0

'Enumerable.Cast ()' nimmt keine "Argumente". Das Argument, das in diesem Fall angegeben wird, ist das Objekt, das Sie die Erweiterungsmethode Anwenden aufrufen möchten. – user7116

0

Ich glaube, du bist für Type.MakeGenericType

+2

Es tut mir leid, aber ich verstehe nicht D so kurze Erklärung, könnten Sie bitte etwas Code schreiben, um es besser zu verstehen? – milan

Verwandte Themen