2009-12-21 4 views
5

можно вызвать с отражением метод с аргументом «explict type» <S> определение
например. oObject.Cast<S>()?Как вызвать общий метод с помощью отражения

где:

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

Я попытался с

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

, но он не работает, кто-нибудь знает почему?


Полный код проверки, но при этом он не работает. В последней строке всегда возникает исключение. Можно ли заставить его работать?

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

ответ

13

Метод расширения Cast живет на классе перечислимых, и вам нужно позвонить MakeGenericMethod:

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

обновление: Поскольку метод является статическим, первый параметр Invoke должен быть null

+0

Функция invoke не принимает один параметр, поэтому, если я ставлю второй параметр как «null», я получаю исключение. подскажите почему? – milan

+0

Исключение составляет: Недопустимое количество параметров. – milan

+0

'Enumerable.Cast ()' не принимает никаких «аргументов». Аргументом, приведенным в этом случае, является объект, который вы хотите вызвать методом расширения. – user7116

0

Я думаю, что вы ищете Type.MakeGenericType

+2

Извините, но я не подставил d такое короткое объяснение, не могли бы вы написать какой-то код, чтобы лучше понять его? – milan

Смежные вопросы