Visual Studio Intellisense无法显示通用重载方法

3

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

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了。


1
尝试在点号后按下ctrl+空格键? - KMån
我曾经在某处读到,用于填充Intellisense方法列表的VS解析器有点懒。我希望我的代码中有一些可以做的事情来帮助它建立正确的列表。 - Jason
1
嗯,智能感知对我来说似乎像预期的那样工作良好,我使用的是VS2008SP1。 - LukeH
你说得对。这让我稍感安慰。我会更新问题,明确指定VS2005。谢谢。 - Jason
4个回答

1

我认为这是因为Intellisense将具有相同名称的项视为通用类型,然后在您给它一个类型之前不会查找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();
    }
}

可能不是最理想的,但我认为除了使用不同的方法名称之外,在代码方面没有任何绕过它的方法。


这正是我担心的。不同的方法名称是一个选择,但框架设计指南说应该避免在方法名称中加入类型名称。你认为不同的方法名称会增加用户在使用API时的复杂度吗?要记住,这是为我的企业环境中的其他开发人员设计的。 - Jason
好吧,不要把我的话当成圣经。也许有一种方法可以解决它,但我看不到。关于复杂性,我认为这完全取决于你打算创建多少个。如果只是为字符串和整数创建1或2个,即ThatString和ThatInt,那么我不认为会有什么大问题。如果您将使用大量类型,则最好放弃通用程序并手动执行所有操作。在可能的情况下,我始终坚持您的编码准则。 - djdd87
这看起来似乎是最佳选择。我将把ThatString、ThatDate和ThatComparable方法添加到工厂中。虽然不是理想的方法,但它能行。 - Jason
很遗憾目前没有其他可用的选择。如果您取消接受此答案并在问题上设置赏金,我不会感到冒犯。我很想看看是否有其他答案。 - djdd87

0

你应该安装Resharper。它比VS 2008的智能感知好得多。


谢谢您的回复,但这并不是一个选项,因为公司不会支付费用。 - Jason

0

我也遇到了同样的问题 - Intellisense并不是很好用。

我开始使用Visual Assist X,并切换到了Visual Assist X。

编辑:(看到你对resharper建议的回答)我认为resharper有一个免费版本。无论如何,VAX真的值得你自己购买。


Resharper确实有一个免费版本供学术或开源使用,但我都不符合条件。我在家里有Resharper,并且很喜欢它,但这是为了在公司环境中由没有并且不会获得Resharper的开发人员使用。 - Jason

0

检查您是否正在引用以RELEASE模式构建的DLL,并将该程序集添加到以DEBUG模式运行的程序集中。

两者都更改为DEBUG模式以确认。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接