如何通过使用lambda表达式作为参数进行reflection来调用方法?

我想做这个:

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

myList是特定类型的通用列表(应用程序未知),我想将其转换为对象列表以执行某些操作。

但是这会失败,并显示以下错误:“无法将lambda表达式转换为’object’类型,因为它不是委托类型”

你能帮我找到什么问题吗? 我想做一些不可能的事吗?

有没有其他方法来实现同样的事情?

lambda表达式可以转换为具有正确签名的委托类型或表达式树 – 但您需要指定它是哪种委托类型。

我认为如果你把它作为一个通用的方法,你的代码会简单得多:

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

然后你只需要通常找到并调用方法:

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

完整的例子:

 using System; using System.Reflection; using System.Collections.Generic; class Test { public static List ConvertToListOfObjects(List list) { return list.ConvertAll(t => t); } static void Main() { object list = new List { 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 objectList = (List) concrete.Invoke(null, new object[] {list}); foreach (object o in objectList) { Console.WriteLine(o); } } } 

lambda形成一个方法 (基本上这只是一个由名称(和范围)标识的方法。由于可以重载具有相同名称的方法,因此方法组包含几个不同的成员)。 这不能总是隐式转换为委托,因为委托实际上绑定到方法组中的单个方法。 这对重载起着重要作用。

不幸的是,同样适用于您的情况。 补救措施是制作一个明确的代表:

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