使用类型参数动态转换对象

时间:2014-03-14 18:24:33

标签: c# reflection delegates

假设你有这个:

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变量变得通用,但就目前而言,我试图避免这种情况。

1 个答案:

答案 0 :(得分:1)

您可以致电Delegate.DynamicInvoke

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

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

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

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