代码之家  ›  专栏  ›  技术社区  ›  Michael Maddox

在编译时类型未知时使用泛型

  •  2
  • Michael Maddox  · 技术社区  · 6 年前

    平台:C 2.0 WinForms

    我有一个工厂类,它根据发送的类型提供特定数据映射器的实例化,代码如下:

    public static IDataMapper<T> GetMapper<T>() where T: IDto
    {
        Type mapperType = MapperLocator.GetMapper(typeof(T));
    
        return (IDataMapper<T>)mapperType.Assembly.CreateInstance(mapperType.FullName);
    }
    

    我正在使用DynamicProxy2拦截对DTO对象的方法调用。在intercept方法中,我尝试使用invocation.targetType中的类型调用上述工厂。然而,这又回到了例外:

    找不到类型或命名空间名称“invocation”。

    显然,这是因为任何对泛型方法的调用都需要根据我在编译时理解的内容明确地知道类型。显然,在这种情况下,我不能这样做,而且我绝对不会在所有DTO对象上执行switch语句。

    你们能提出一个策略或者指出我做错了什么吗?我正试图使它尽可能通用,以便它可以适用于我的所有对象和任何新对象,以及代码可移植到其他项目。

    事先谢谢!

    2 回复  |  直到 16 年前
        1
  •  3
  •   RAOF    8 年前

    我不太熟悉DTO,不知道这里是否有足够的信息来提供完整的解决方案。这就是说, another answer 基本上是正确的;C编译器在编译时需要类型信息。

    然而,有一种方法可以解决这个问题:反思。 System.Reflection (特别是 MethodInfo 在您的情况下,我认为)将允许您编写一个完全通用的解决方案。

    如果我已经正确理解了这个问题,那么您将要做的是获取该工厂函数的MethodInfo,并用 MakeGenericMethod ,然后调用它。

        2
  •  0
  •   Callum Rogers    16 年前

    不幸的是,没有办法解决这个问题;.NET C编译器需要在编译时知道泛型的类型;您必须找到另一个方法。

    您也许可以使用装箱/拆箱和非泛型,但我不太了解如何实现这一点。或者,您可以使用 System.Reflection . 再说一次,我不知道怎么做。