假设你有这个:
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
变量变得通用,但就目前而言,我试图避免这种情况。
答案 0 :(得分:1)
您可以致电Delegate.DynamicInvoke
:
bool result = (bool)work.DynamicInvoke(thingy);
解决这些类型问题的其他选项包括以下内容,每个选项都提供了改进的静态类型安全性,但可能适用于您的代码,也可能不适用。
为参数创建闭包。只要thingy
定义时work
可用且不会更改,此方法将提供比DynamicInvoke
更好的性能。
Func<bool> work = () => FooWork(thingy);
使您的包装器具有通用性,并使用work
声明Func<T, bool>
,其中T
是包装器的通用类型。