在我的代码中,我声明了一个接口如下:
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);
但由于我在编译时不知道泛型参数的类型,我不知道在我使用?
的地方放什么或如何使这项工作一点都不。
任何帮助都很高兴。
答案 0 :(得分:1)
我建议使用该方法的泛型和非泛型版本,就像List<T>
实现IEnumerable<T>
一样,同时也明确实现System.Collections.IEnumerable
。
&#34;仅在运行时&#34;正是这些泛型并不打算用于。你调用这种方法的方式,无论如何你只能得到object
。最好有一个真正的普通非泛型方法,只返回object
。
T GetOfType<T>();
object GetOfType(Type t);
您甚至不必担心重载解决方案。诚然,在实现界面的类上有一些额外的负担。但正如你所见,在某个地方会成为负担。