Visual Studio Intellisense没有显示泛型重载的方法

时间:2009-11-19 13:39:41

标签: c# generics methods intellisense overloading

给出以下两个接口(这些是小例子,而不是我的实际实现):

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。

4 个答案:

答案 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非常值得您自己购买。