代码之家  ›  专栏  ›  技术社区  ›  Jason

Visual Studio Intellisense未在泛型重载上显示方法

  •  3
  • Jason  · 技术社区  · 16 年前

    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());
    

    我遇到的问题以及这个问题的全部要点是,VisualStudio2005IntelliSense没有解决两者之间的差异。

    Require.That("..."). 我希望看到一份

    Evaluate(Predicate predicate)
    IsNull()
    IsNotNullOrEmpty()
    

    但我什么也没看到。

    我真的希望为重载保留相同的方法名。我希望保留泛型重载,因为IAsertion接口的Evaluate方法中存在谓词。

    另外,我知道我可以使用扩展方法来做一些类似的事情,但这不是一个选项,因为我仍然希望支持.NET2.0,并且希望保留fluent api。

    更新:

    有一些很好的答案涉及到VisualStudio的第三方附加组件。不幸的是,由于公司的繁文缛节,我无法为VisualStudio安装或购买附加工具(我讨厌政治!)

    我正在寻找一个只适用于代码的选项,它将在VisualStudio2005和VisualStudio2008中都能工作。

    更新:

    这在Visual Studio 2008中有效。谢谢, Luke . 这只剩下VisualStudio2005了。

    4 回复  |  直到 9 年前
        1
  •  1
  •   djdd87    16 年前

    我相信这是因为Intellisense看到的项与泛型类型具有相同的名称,然后在您为其指定类型之前,不会费心查找Intellisense属性。例如,如果将鼠标悬停在“ Require.That(string) “视觉工作室将以 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();
        }
    }
    

    可能不太理想,但我认为除了使用不同的方法名之外,在代码方面没有其他解决方法。

        2
  •  0
  •   Muad'Dib    16 年前

    我相信你们刚刚面对现实,有时候Intellisense只是简单的不那么聪明,有时甚至是愚蠢的。

        3
  •  0
  •   Graviton    16 年前

    你应该安装 Resharper 那么。这比VS 2008 intellisense好多了。

        4
  •  0
  •   Fox    16 年前

    这里也有同样的问题——智能感知并没有那么好。

    我开始使用视觉辅助X,然后切换到视觉辅助X。

    编辑: