gpt4 book ai didi

c# - 如何使用 lambda 表达式作为参数通过反射调用方法?

转载 作者:太空狗 更新时间:2023-10-29 23:12:01 24 4
gpt4 key购买 nike

我想这样做:

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 是一个特定类型的泛型列表(应用程序不知道),我想将它转换成一个对象列表来做一些操作。

然而,这失败并出现此错误:“无法将 lambda 表达式转换为类型‘object’,因为它不是委托(delegate)类型”

你能帮我找出问题所在吗?我是否正在尝试做一些不可能的事情?

有没有其他方法可以达到同样的目的?

最佳答案

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

如果您将其设为通用方法,我认为您的代码会简单得多:

public static List<object> ConvertToListOfObjects<T>(List<T> list)
{
return list.ConvertAll<object>(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<object> objectList = (List<object>) concrete.Invoke(null,
new object[]{list});

完整示例:

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

关于c# - 如何使用 lambda 表达式作为参数通过反射调用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/436716/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com