为了账号安全,请及时绑定邮箱和手机立即绑定

使用反射和运行时已知的类型调用 Func 对象

使用反射和运行时已知的类型调用 Func 对象

C#
幕布斯6054654 2021-10-23 16:20:16
我一直在努力处理这种情况。我有一种情况,我有一个Type和类型的对象,Func<string, (bool, T)>其中 T 与Type. 我希望能够通过反射或其他方式调用它的Invoke方法。我Type在运行时有一些:Type type;我有Func记忆,但作为一个object:object func;底层的 Typefunc就是我之前描述的。例如,如果type代表DateTime,则func的基础类型将是:Func<string, (bool, DateTime)>但是type在运行时可以是任何东西,所以如果它是一个int,那么func现在将是一个Func<string, (bool, int)>我如何使用我在运行时拥有正确类型的事实来调用我的 func?我假设我必须使用某种反射,但并没有真正理解它以开始使用。任何帮助是极大的赞赏。总的来说,我对反思还很陌生,但我发现它对某些事情来说非常有趣且非常困难。如果您有任何关于阅读的建议或任何其他关于如何更好地学习反思的技巧,那也太棒了!经过更多思考后编辑/更新:以dynamic这种方式使用和调用 Invoke会更好吗?看起来它会工作得很好,但是这就提出了一个问题,为什么你会经历更困难或更长时间的设置反射来调用某些东西的过程,而不是简单的动态调用。无论如何,我仍然想知道这将如何使用反射来工作,看看会很有趣
查看完整描述

2 回答

?
繁花如伊

TA贡献2012条经验 获得超12个赞

如果您知道像 Func 这样的函数类型,则可以直接将其转换为如下所示


 private static void InvokeFunctionDynamically<T>(T data)

    {            


        //1. Define the delegate 

        Func<string, bool, T> genericFunction = (name, isEnabled) =>

        {

            if(isEnabled)

            {

                return data;

            }


            return default(T);

        };


        // 2. demonstrate that the delegate is retrieved at the run time as an object

        object runtimeObject = genericFunction;



        //3. Cast it directly to the delegate type

        var result =((Func<string, bool, T>) runtimeObject)("hello", true);


        Console.WriteLine($"Result {result}");

    }

结果如下:

//img1.sycdn.imooc.com//6173c5e30001ad3220700840.jpg

查看完整回答
反对 回复 2021-10-23
  • 2 回答
  • 0 关注
  • 140 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信