【问题标题】:Dynamically Convert an Object Using a Type Parameter使用类型参数动态转换对象
【发布时间】:2014-03-14 18:24:33
【问题描述】:

假设你有这个:

Type theType = typeof(Foobar);
object thingy = new Foobar();
Func<Foobar,bool> FooWork = (f) => return true;
Delegate work = FooWork;

//Without using static cast operations, how do I use 'theType' variable to
//cast the 'work' Delegate back to something I can invoke?
//This next line is very wrong...
bool result = ((Func<theType, bool>)work)(thingy);

要重申评论,如何在不使用静态转换操作的情况下进行转换?我只是想让work 变量保存FooWork 委托,而不知道Foobar 类型。

我可以解决我的整体问题,如果我简单地让我的包装类通用,这样work 变量就变成了通用的,但目前我正试图避免这种情况。

【问题讨论】:

    标签: c# reflection delegates


    【解决方案1】:

    您可以拨打Delegate.DynamicInvoke:

    bool result = (bool)work.DynamicInvoke(thingy);
    

    解决这些类型问题的其他选项包括以下内容,每个选项都提供了改进的静态类型安全性,但可能适合也可能不适合您的代码。

    1. 为参数创建一个闭包。只要thingy 在定义work 时可用并且不会改变,此方法将提供比DynamicInvoke 更好的性能。

      Func<bool> work = () => FooWork(thingy);
      
    2. 使您的包装器通用,并使用Func&lt;T, bool&gt; 声明work,其中T 是包装器的通用类型。

    【讨论】:

    • 我害怕我会被委托给丑陋的反射代码。您的解决方案有效。太棒了!
    • @BrentArias 我编辑了答案以提供替代方案。
    猜你喜欢
    • 1970-01-01
    • 2020-07-25
    • 2018-10-13
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 2015-11-25
    相关资源
    最近更新 更多