代码之家  ›  专栏  ›  技术社区  ›  Thomas Flinkow

只有在运行时才知道泛型类型的委托

  •  1
  • Thomas Flinkow  · 技术社区  · 8 年前

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

    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 回复  |  直到 8 年前
        1
  •  1
  •   15ee8f99-57ff-4f92-890c-b56153    8 年前

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

    “只有在运行时才知道类型”正是泛型不打算用于的。你调用这个方法的方式 object 不管怎么说。最好有一个真正的普通非泛型方法,只返回 对象 .

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

    你甚至不需要担心过载问题。诚然,实现接口的类会承受一些额外的负担。但正如你们所看到的,在某些地方会有负担。