【发布时间】:2010-12-18 07:32:54
【问题描述】:
给定以下两个接口(这些是小例子,不是我的实际实现):
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("..."). 时,我应该会看到一个列表
但我什么也没看到。
我真的很想为重载保留相同的方法名称。由于 IAssertion 接口的 Evaluate 方法中的谓词,我想保留泛型重载。
另外,我知道我可以使用扩展方法做一些接近此的事情,但这不是一个选项,因为我仍然想支持 .Net 2.0 并希望保持流畅的 api。
更新:
已经有一些很好的答案涉及到 Visual Studio 的第三方插件。不幸的是,由于我正在开发的公司繁文缛节,我无法安装或购买 Visual Studio 的附加工具。 (我讨厌政治!)
我正在寻找一种仅适用于 Visual Studio 2005 和 Visual Studio 2008 的代码选项。
更新:
这适用于 Visual Studio 2008。谢谢Luke。只剩下 Visual Studio 2005。
【问题讨论】:
-
尝试在点号后按 ctrl+空格键?
-
有,也没有。我在某处读到 VS 用来填充 Intellisense 方法列表的解析器有点懒惰。我只是希望我可以在我的代码中做些什么来帮助它构建正确的列表。
-
嗯,intellisense 似乎使用 VS2008SP1 为我准备好了一切。
-
你是对的。这至少有点令人欣慰。我将更新问题以指定 VS2005。谢谢。
标签: c# generics methods intellisense overloading