【发布时间】:2017-12-08 19:14:01
【问题描述】:
在我的代码中,我声明了一个接口如下:
interface IGeneric
{
T GetOfType<T>();
}
而且我想使用仅在运行时才知道的泛型类型调用接口的方法。这就是我目前的做法,并且有效:
Type genericArgument = ...
object interfaceImplementation = ...
MethodInfo methodInfo = typeof(IGeneric).GetMethod("GetOfType").MakeGenericMethod(genericArgument);
methodInfo.Invoke(interfaceImplementation, null);
但是因为我必须经常调用这部分代码,所以我想将方法信息缓存在委托中。我试过这个委托定义
private delegate T GetOfTypeDelegate<T>();
并尝试使用我检索到的方法信息创建一个委托,如上所示:
GetOfTypeDelegate<?> deleg = (GetOfTypeDelegate<?>) Delegate.CreateDelegate(typeof(GetOfTypeDelegate<?>), methodInfo);
但由于我在编译时不知道泛型参数的类型,所以我不知道在我使用 ? 的地方放置什么或如何使它工作.
非常感谢任何帮助。
【问题讨论】:
-
这是你自己的界面吗?由于无论如何您都会以非泛型方式调用该方法,因此我会考虑重写接口以提供仅返回
object的方法的非泛型版本。由于您发现的原因,“仅在运行时知道类型”对于泛型方法确实不是一个好的用例。 -
@EdPlunkett 谢谢你,你是对的。如果没有其他办法,我将求助于重写界面。目前,我不想这样做,因为太多其他代码依赖于该通用方法。
标签: c# generics reflection delegates