2

平台: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 中的类型调用上述工厂。然而,这回来了一个例外:

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

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

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

提前致谢!

4

2 回答 2

3

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

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

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

于 2009-07-16T22:18:04.283 回答
0

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

您也许可以使用装箱/拆箱和非泛型,但我不太了解您将如何实现它。或者,您可以使用System.Reflection. 同样,我不知道该怎么做。

于 2009-07-16T22:01:37.200 回答