给出以下两个接口(这些是小例子,而不是我的实际实现):
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 intellisense没有解决两者之间的差异。
当我输入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。
答案 0 :(得分:1)
我相信这是因为Intellisense看到的项目与Generic Type同名,然后在给它一个类型之前不会费心去寻找intellisense属性。例如,如果将鼠标悬停在“Require.That(string)
”上,Visual Studios会将其报告为IAssertion
,而不是IStringAssertion
。
无论如何,您可以将IStringAssertion的“That”重命名为“ThatString”。即
public static class Require
{
public static IStringAssertion ThatString(string value)
{
return null;
}
public static IAssertion<T> That<T>(T value)
{
return null;
}
}
public class RAR
{
public void TestMethod(StringComparer a, string b)
{
Require.That<StringComparer>(a).IsNotNull();
Require.ThatString(b).IsNotNullOrEmpty();
}
}
可能不理想,但我不相信除了使用不同的方法名称之外,在代码方面还有任何方法。
答案 1 :(得分:0)
我相信你刚刚接触到现实,有时智能感知并不是那么聪明,并且有时候只是愚蠢。
答案 2 :(得分:0)
然后你应该安装Resharper。它比VS 2008 intellisense好很多。
答案 3 :(得分:0)
这里的问题相同 - 智能感知并不是那么好。
我开始使用Visual Assist X,并切换到Visual Assist X。
编辑(看到你对resharper建议的回答)我认为resharper有免费版本。无论如何,VAX非常值得您自己购买。