我通常非常谨慎地使用扩展方法。当我觉得有必要编写扩展方法时,我有时想要重载该方法。我的问题是,您对扩展方法调用其他扩展方法有何看法?不好的做法?这感觉不对,但我无法真正定义原因。

例如,第二个CaselessIs方法调用第一个:

public static bool CaselessIs(this string s, string compareTo)
{
    return string.Compare(s, compareTo, true) == 0;
}

public static bool CaselessIs(this string s, IEnumerable<string> compareTo)
{
    foreach(string comparison in compareTo)
    {
        if (s.CaselessIs(comparison))
        {
            return true;
        }
    }

    return false;
}

不这样做会更合适吗?缺点是它违反DRY。

public static bool CaselessIs(this string s, string compareTo)
{
    return string.Compare(s, compareTo, true) == 0;
}

public static bool CaselessIs(this string s, IEnumerable<string> compareTo)
{
    foreach(string comparison in compareTo)
    {
        if (string.Compare(s, comparison, true) == 0)
        {
            return true;
        }
    }

    return false;
}
有帮助吗?

解决方案

我不得不说DRY控制在这里。就个人而言,我认为扩展方法调用另一个扩展方法没有错,特别是如果其他扩展包含在同一个程序集中。总而言之,方法调用只是由编译器从以下文件中翻译而来:

extended.ExtensionMethod(foo);

为:

StaticType.ExtensionMethod(extended, foo);

我没有看到将两个静态方法链接在一起的任何问题,所以传递上,我没有看到链接两个扩展方法的问题。

其他提示

我个人认为没有问题,第二种情况我认为感觉更错......

完全正确。为什么会出错?

当你定义一个扩展方法时,你实际上是针对3.0框架(实际上是新语言的编译器扩展),所以使用另一个扩展来完成工作并没有错。

回顾评论,任何版本都没有错,即使是“其他”版本也没有错。扩展在另一个库中,至少不是在“使用”的意义上。另一个的延伸。扩展只是一种语法功能,有助于更好地理解代码之间的底层逻辑,为类添加一些常用操作......实际上它们只是对方法的屏蔽调用,这样你应该应用完全相同的限制方法调用。

我对此没有任何问题 - 但是,如果它让你感觉更好,你当然可以使用静态版本:

public static bool CaselessIs(this string s, IEnumerable<string> compareTo)
{
   foreach(string comparison in compareTo)
   {
      if (Extensions.CaselessIs(s, comparison))
      {
         return true;
      }
   }

   return false;
}

就个人而言,在这个例子中,我会称它为CaselessMatches,并且单数称为复数...但我认为这只是挑剔。

我认为没有错。假设你创建了一个someClass.ToMySpecialString()。如果someClass.ToString()已经有多个重载,你为什么不能重载它呢?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top