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