当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何通过使用lambda表达式作为参数进行反射来调用方法?》经验,为你挑选了1个好方法。

我想做这个:

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',因为它不是委托类型"

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

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



1> Jon Skeet..:

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

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有