【问题标题】:Visual Studio Intellisense not showing methods on generic overloadVisual Studio Intellisense 未显示有关泛型重载的方法
【发布时间】: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("..."). 时,我应该会看到一个列表

评估(谓词谓词) 一片空白() IsNotNullOrEmpty()

但我什么也没看到。

我真的很想为重载保留相同的方法名称。由于 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


【解决方案1】:

我相信这是因为 Intellisense 会看到与通用类型同名的项目,然后在您给它一个类型之前不会费心寻找智能感知属性。例如,如果您将鼠标悬停在“Require.That(string)”上,Visual Studios 会将其报告为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();
    }
}

可能并不理想,但我认为除了使用不同的方法名称之外,在代码前面没有任何解决办法。

【讨论】:

  • 这就是我害怕的。不同的方法名称是一种选择,但框架设计指南说您应该将类​​型名称保留在方法名称之外。从用户的角度来看,您认为不同的方法名称会增加 api 的复杂性吗?请记住,这适用于我公司环境中的其他开发人员。
  • 好吧,不要把我的话当成福音。可能有办法绕过它,但我看不到它。参考复杂性,我认为这完全取决于您打算创建多少。如果 string 和 int 只是 1 或 2,即 ThatString 和 ThatInt,那么我看不出有什么大问题。如果您要使用很多类型,那么您最好放弃泛型并手动完成它们。在可能的情况下,我会始终遵守您的编码指南。
  • 这看起来将是最好的选择。我将向工厂添加 ThatString、ThatDate、ThatComparable... 方法。不理想,但它会起作用。
  • 很遗憾没有其他选择。如果您不接受此答案并悬赏该问题,我不会生气。我很想看看是否还有其他答案。
【解决方案2】:

我相信您刚刚面对这样一个现实:有时 Intellisense 并不那么聪明,而且有时只是愚蠢的。

【讨论】:

  • 同意,但这段代码不只适合我。它是为我团队中的其他开发人员开发的一些框架代码的一部分,如果没有 Intellisense 告诉他们可以使用哪些方法,他们就会丢失。我不希望他们每次使用这些类时都必须在文档中查找它。
【解决方案3】:

然后你应该安装Resharper。它比 VS 2008 智能感知要好很多。

【讨论】:

  • 感谢您的回复,但这确实不是一个选择,因为公司不会为此付费。
【解决方案4】:

同样的问题 - Intellisense 不是很好。

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

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

【讨论】:

  • Resharper 确实有供学术或开源使用的免费版本,我都没有资格使用。我在家里确实有 Resharper,我很喜欢它,但这是供没有也不会获得 Resharper 的开发人员在企业环境中使用的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-11
  • 1970-01-01
  • 2013-07-19
  • 2019-02-16
  • 1970-01-01
  • 1970-01-01
  • 2020-04-11
相关资源
最近更新 更多