4

我有以下问题开始让我发疯。我Class1在 Assembly1 中有一个班级发言权。我移至Class1Assembly2 并在 Assembly2 中废弃Class1(保留相同的命名空间,我现在无法删除它以避免对我的用户造成重大更改)。

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

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

编辑我不能使用类型转发,因为 Assembly1 不能引用 Assembly2 :(

4

2 回答 2

6

你可以试试TypeForwardedTo属性。

[assembly:TypeForwardedTo(typeof(Class1))]

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

编辑:如果您不能从 Assembly1 中引用 Assembly2,您可以定义一个extern alias
MSDN Documentation for extern alias (C# Reference)

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

然后,您只需要使用 . 来限定您的类型yourAlias::Class1

于 2012-06-22T12:02:12.900 回答
3

您应该为您的程序集设置别名。

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

还要添加extern alias a2您的代码。

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

Jon Skeet 已经解释了这是如何工作的

于 2012-06-22T12:05:27.270 回答