在编译时不知道类型时使用泛型

时间:2009-07-16 21:17:40

标签: c# design-patterns generics castle-dynamicproxy

平台: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对象的方法调用。在我的拦截方法中,我试图使用Invocation.TargetType中的类型调用上面的工厂。然而,这有例外:

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

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

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

提前致谢!

2 个答案:

答案 0 :(得分:3)

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

然而,有一种解决方法:反思。 System.Reflection(我认为特别是MethodInfo)将允许您编写完全通用的解决方案。

如果我正确理解了这个问题,那么你要做的就是获取该工厂函数的MethodInfo,用MakeGenericMethod替换类型,然后调用它。

答案 1 :(得分:0)

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

你可以使用装箱/拆箱和非通用,但我不太了解你将如何实现这一点。或者,您可以使用System.Reflection。同样,我不知道该怎么做。