在两个引用的程序集之间键入歧义

时间:2012-06-22 12:00:32

标签: c#

我有以下问题开始让我疯狂。 我在Assembly1中有一个班级Class1。我在Assembly2中将Class1移动到Assembly2并废弃了Class1(保留了相同的命名空间,我现在无法将其删除以避免对用户进行重大更改)。

现在我有一个单元测试程序集TestAssembly2,它引用程序集Assembly1和Assembly2。现在,在我的单元测试中尝试使用Class1时,我遇到了编译问题Class1歧义。这是有道理的,因为我在程序集Assembly1和Assembly2中有两个Class1

问题 有没有办法告诉编译器使用Assembly2中定义的Class1(因为Assembly1中的那个已经过时)而不是Assembly1?

编辑我无法使用类型转发,因为Assembly1必须没有对Assembly2的引用:(

2 个答案:

答案 0 :(得分:5)

您可以尝试TypeForwardedTo属性。

[assembly:TypeForwardedTo(typeof(Class1))]

这样你就可以完全将类型移动到另一个组件而不会破坏任何东西。您甚至不需要重建引用程序集,因为运行时会为您处理转发 有关更多信息,请参见此处:
Type forwarding using TypeForwardedTo attribute

编辑:如果您无法从Assembly1引用Assembly2,则可以定义extern alias
MSDN Documentation for extern alias (C# Reference)

您可以通过在解决方案资源管理器中选择对程序集的引用并在属性窗口中编辑别名来定义它们。

您只需要使用yourAlias::Class1来确定您的类型。

答案 1 :(得分:3)

您应该为您的程序集添加别名。

在您的消费项目的引用节点下,选择Assembly2并设置不同的“别名”,例如“a2”。

还要在代码中添加extern alias a2

当您需要引用此类型时,请使用a2::YourName.Class2。这将消除歧义。

Jon Skeet has already explaining how this works