问题描述
背景
我正在尝试获取一个方法(使用反射),并将其转换为委托(使用 Delegate.CreateDelegate()
方法),并为了提高性能,将生成的 Delegate
对象转换为 Func<Task<BaseClass>>
所以我可以调用 Invoke()
而不是非常慢的 DynamicInvoke()
。
但是,我收到一个运行时错误:Unable to cast ...
。
简化
考虑这种情况:Task<object> foo = (Task<string>)null;
,我想将 Task<string>
强制转换为 Task<object>
并引发错误。显然是因为 Task<>
不是逆变的。
如果我将 Task<T>
包装到另一个类中(比如 Taskwrapper<out T>
)并实现它的隐式转换,那么 Taskwrapper
就不会是 awaitable
。
基于 GitHub 上的 this 问题,我现在可以使用 ITask 接口。但是代码不够流行(或微软引用),无法依赖。
我想知道是否还有其他方法可以将 Task<DeriveClass>
转换为 Task<BaseClass>
?或者任何可以保留我的方法 awaitable
的替代方法。
一些代码
var genericTask = typeof(Task<>).MakeGenericType(dynamicOutputType);
var genericFunc = typeof(Func<>).MakeGenericType(genericTask);
var getResultDelegate = Delegate.CreateDelegate(genericFunc,result.ActionObject,"GetResult");
methodGetResult = (Func<Task<object>>)getResultDelegate; -- runtime Error here!
我想缓存上面的 methodGetResult
变量并像这样重用它:
dynamic taskResult = cacheElements.MethodGetResult.Invoke(inputValue);
var result = await taskResult.ConfigureAwait(false);
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)