在另一个过时方法中使用过时方法时强制编译错误

Posted

技术标签:

【中文标题】在另一个过时方法中使用过时方法时强制编译错误【英文标题】:Force compile error when obsolete method is used in another obsolete method 【发布时间】:2013-05-01 15:05:36 【问题描述】:

我正在为 DotNet 4.0 中的 Fitnesse 编写一些固定代码,并希望保护我的 api 方法不被用于代码库中。我认为这可以使用 [Obsolete] 属性来完成,但是如果您在另一个标记为过时的方法中使用过时的方法,这不会产生编译错误。

[Obsolete("Used only externally", true)]
public void Method1() 


[Obsolete("Used only externally", true)]
public void Method2() 
    Method1();

我希望上面的代码生成一个编译错误。有没有其他方法可以解决这个问题?最好在 DotNet 框架内?

【问题讨论】:

【参考方案1】:

您不应该将您的夹具代码放入您想要测试的程序集中。相反,您应该为您的夹具代码创建一个单独的项目。夹具代码应使用与程序集的其他客户端相同的公共 API 访问您的“被测系统”。

而您在 FitNesse 中编写的测试只能访问夹具组件。

+----------------+    +-----------------+    +-------------------+
| FitNesse Tests | -> | Fixture Assembly| -> | System under test |
+----------------+    +-----------------+    +-------------------+
                                                   ^
                       +----------------+          |
                       | Other Clients  | ---------+
                       +----------------+

【讨论】:

Fixture 代码正在包装 Selenium Web 驱动程序。如果我将逻辑分成两个单独的程序集,我会遇到同样的问题,主要是我想强制执行一个规则,即给定程序集中的方法不能相互调用。【参考方案2】:

您没有给出您的用例的真实示例,但如果您想保护您的 API 方法不被其他程序集调用,为什么不使用 internal 访问修饰符?

http://msdn.microsoft.com/en-us/library/7c5ka91b.aspx

【讨论】:

我试图抽象出用例。我想要这个的原因是,对于我暴露给 Fitnesse 的每种方法,我都必须添加一些样板代码。 1) 将所有内容都包装在 try catch 中。 2)在做任何工作之前调用相同的方法。 3)翻译异常,以便fitnesse以不同的方式显示它。从另一个调用这些特殊方法之一会破坏事情。 @JoshuaJewell - 我现在明白了,真正的问题是您将代码直接添加到库中只是为了测试它。您根本不应该这样做,添加Obsolete 属性只是解决问题的创可贴。如果您在 OP 中包含更多细节,也许人们可以提供另一种方法。 您能解释一下为什么需要特殊方法从 FitNesse 调用吗?一般来说,FitNesse 和您的夹具代码应该调用属于您的正常生产代码一部分的方法。在 FitNesse 方面,可能还有其他方法可以完成您所需要的。 我的夹具代码正在使用 Selenium Web 驱动程序,并通过在 Fitnesse 测试结果中提供屏幕截图链接等内容来扩展其功能。

以上是关于在另一个过时方法中使用过时方法时强制编译错误的主要内容,如果未能解决你的问题,请参考以下文章

“创建预编译的整理器,因为整理器已过时”

导入项目运行报错:某些输入文件使用或覆盖了已过时的 API......

我的 Visual C++ 编译器编译过时的源代码

c++intellisense信息可能过时头文件无法读取

使用过时的 C 编译器是不是存在安全风险?

Spring源码编译报错:reactor.core.publisher中的MonoProcessor已过时