2009-01-12 13 views
5

Bunu yapmak istiyorum:Bir lambda ifadesiyle yansıma yoluyla bir yöntemi nasıl parametre olarak çağırırım?

MethodInfo m = myList.GetType().GetMethod("ConvertAll", System.Reflection.BindingFlags.InvokeMethod).MakeGenericMethod(typeof(object)); 
List<object> myConvertedList = (List<object>)m.Invoke(myList, new object[]{ (t => (object)t)}); 

myList, belirli bir türün genel bir listesidir (uygulamaya bilinmeyen) ve bazı işlemleri yapmak için nesnelere dönüştürmek istiyorum.

Ancak bu hatayla başarısız olur: "Nesne türü" nesnesine "dönüştürülemez çünkü bir temsilci türü değildir"

Neyin yanlış olduğunu bulmanıza yardımcı olabilir misiniz? Mümkün olmayan bir şey yapmaya çalışıyorum mı?

Aynı şeyi elde etmenin başka bir yolu var mı?

cevap

5

Lambda deyimi bir temsilci türü veya sağ imzasıyla bir ifade ağacına ya dönüştürülebilen - ancak bunu hangi temsilci tipi belirtmek gerekir.

Bunu genel bir yöntem yaptıysanız kodunuzu çok basit olacağını düşünüyorum:

public static List<object> ConvertToListOfObjects<T>(List<T> list) 
{ 
    return list.ConvertAll<object>(t => t); 
} 

Sonra sadece bulup çağırmak gerek jenerik o yöntemi:

MethodInfo method = typeof(Foo).GetMethod("ConvertToListOfObjects", 
    BindingFlags.Static | BindingFlags.Public); 
Type listType = list.GetType().GetGenericArguments()[0]; 
MethodInfo concrete = method.MakeGenericMethod(new [] { listType }); 
List<object> objectList = (List<object>) concrete.Invoke(null, 
                new object[]{list}); 

Komple örnek:

using System; 
using System.Reflection; 
using System.Collections.Generic; 

class Test 
{ 
    public static List<object> ConvertToListOfObjects<T>(List<T> list) 
    { 
     return list.ConvertAll<object>(t => t); 
    } 

    static void Main() 
    { 
     object list = new List<int> { 1, 2, 3, 4 }; 

     MethodInfo method = typeof(Test).GetMethod("ConvertToListOfObjects", 
      BindingFlags.Static | BindingFlags.Public); 
     Type listType = list.GetType().GetGenericArguments()[0]; 
     MethodInfo concrete = method.MakeGenericMethod(new [] { listType }); 
     List<object> objectList = (List<object>) concrete.Invoke(null, 
                new object[] {list}); 

     foreach (object o in objectList) 
     { 
      Console.WriteLine(o); 
     } 
    } 
} 
1

Bir lambda, grubu bir yöntemi oluşturur (temel olarak, bu yalnızca ad (ve kapsam) ile tanımlanan bir yöntemdir. Aynı ada sahip yöntemlerin aşırı yüklenmesi nedeniyle, bir yöntem grubu birkaç farklı üyeden oluşur). Bir temsilci aslında bir yöntem grubunun içinden tek bir yönteme bağlı olduğundan, bu her zaman dolaylı olarak bir temsilci haline dönüştürülemez. Bu aşırı yükleme ile bir rol oynar.

Ne yazık ki, sizin durumunuz için de geçerlidir. çare açık bir temsilci yapmaktır:

List<object> myConvertedList = (List<object>)m.Invoke(myList, new object[]{ new Func<YourType, object>(t => (object)t)}); 
+1

Zorluk, YourType'ın derleme zamanında bilinmediğidir - bu yüzden bunu genel bir yönteme çevirme önerim. –

+0

Ah lanet olsun, buna dikkat etmedim. –

+0

Evet, aynı şeyi yorumlamak üzereydim ... Yine de teşekkürler – juan

İlgili konular