使用仅在运行时知道的泛型类型的委托

时间:2017-12-08 19:14:01

标签: c# generics reflection delegates

在我的代码中,我声明了一个接口如下:

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);

但由于我在编译时不知道泛型参数的类型,我不知道在我使用?的地方放什么或如何使这项工作一点都不。

任何帮助都很高兴。

1 个答案:

答案 0 :(得分:1)

我建议使用该方法的泛型和非泛型版本,就像List<T>实现IEnumerable<T>一样,同时也明确实现System.Collections.IEnumerable

&#34;仅在运行时&#34;正是这些泛型并不打算用于。你调用这种方法的方式,无论如何你只能得到object。最好有一个真正的普通非泛型方法,只返回object

   T GetOfType<T>();
   object GetOfType(Type t);

您甚至不必担心重载解决方案。诚然,在实现界面的类上有一些额外的负担。但正如你所见,在某个地方会成为负担。