给定以下两个接口(这些只是小例子,不是我的实际实现):
public interface IAssertion<T> {
IAssertion<T> IsNotNull();
IAssertion<T> Evaluate(Predicate<T> predicate)
}
public interface IStringAssertion : IAssertion<string> {
IStringAssertion IsNotNullOrEmpty();
}
还需要一个静态工厂,它将返回适当的接口,例如:
public static class Require {
public static IAssertion<T> That<T>(T value) {
...
}
public static IStringAssertion That(string value) {
...
}
}
我应该能够做到以下事情:
public void TestMethod(SomeClass a, string b) {
Require.That(a).IsNotNull();
Require.That(b).IsNotNullOrEmpty().Evaluate(SomeMethodThatAcceptsString);
}
这段代码可以编译并实际运行。我甚至可以设置通过的测试,例如:
Assert.IsInstanceOf<IStringAssertion>(Require.That(string.Empty));
Assert.IsNotInstanceOf<IStringAssertion>(Require.That(new object());
我遇到的问题,也是这个问题的重点,就是Visual Studio 2005智能感知无法区分两者之间的差异。
当我输入
Require.That("...").
时,我应该期望看到一个列表:
Evaluate(Predicate predicate) IsNull() IsNotNullOrEmpty()但实际上我什么也没有看到。
我真的希望保留相同的方法名称用于重载。我想保留泛型重载,因为在IAssertion接口的Evaluate方法中有谓词。
此外,我知道可以使用扩展方法做到类似的事情,但这不是一个选项,因为我仍然想支持.Net 2.0并保持流畅的API。
更新:
已经有一些好的答案涉及到Visual Studio的第三方插件。不幸的是,由于我正在开发的公司政策原因,我无法安装或购买Visual Studio的插件工具。(我讨厌政治!)
我正在寻找一个只涉及代码的选项,可以在Visual Studio 2005和Visual Studio 2008中使用。
这在Visual Studio 2008中有效。感谢Luke。这只剩下Visual Studio 2005了。