给定以下两个接口(interface)(这些是小例子,不是我的实际实现):
public interface IAssertion<T> {
IAssertion<T> IsNotNull();
IAssertion<T> Evaluate(Predicate<T> predicate)
}
public interface IStringAssertion : IAssertion<string> {
IStringAssertion IsNotNullOrEmpty();
}
和一个将返回适当接口(interface)的静态工厂,例如:
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 接口(interface)的 Evaluate 方法中的谓词,我想保留泛型重载。
此外,我知道我可以使用扩展方法做一些接近此的事情,但这不是一个选项,因为我仍然想支持 .Net 2.0 并希望保持流畅的 api。
更新:
有一些很好的答案涉及 Visual Studio 的第三方加载项。不幸的是,由于我正在开发的公司繁文缛节,我无法安装或购买 Visual Studio 的附加工具。 (我讨厌政治!)
我正在寻找可在 Visual Studio 2005 和 Visual Studio 2008 中运行的纯代码选项。
更新:
这适用于 Visual Studio 2008。谢谢,Luke .那只剩下 Visual Studio 2005。
最佳答案
我相信这是因为 Intellisense 看到了与通用类型同名的项目,然后才懒得去寻找 intellisense 属性,直到你给它一个类型。例如,如果您将鼠标悬停在“Require.That(string)
”上,Visual Studio 会将其报告为 IAssertion
,而不是 IStringAssertion
.
无论如何,您可以将 IStringAssertion 的“That”重命名为“ThatString”。 IE。
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();
}
}
可能不理想,但我认为除了使用不同的方法名称之外,在代码前端没有任何解决方法。
关于c# - Visual Studio Intellisense 不显示泛型重载的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1763366/