2

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

例如,第二个 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;
}
4

5 回答 5

9

我不得不说 DRY 在这里控制。就个人而言,我认为扩展方法调用另一个扩展方法没有任何问题,特别是如果另一个扩展包含在同一个程序集中。总而言之,方法调用只是由编译器从:

extended.ExtensionMethod(foo);

到:

StaticType.ExtensionMethod(extended, foo);

我没有看到将两个静态方法链接在一起有任何问题,因此,我认为链接两个扩展方法没有问题。

于 2008-10-22T18:53:16.397 回答
3

个人觉得没啥问题,我觉得第二种情况感觉更不对......

于 2008-10-22T18:52:11.563 回答
2

完全正确。为什么应该是错的?

当您定义扩展方法时,您隐含地针对 3.0 框架(实际上是新语言的编译器扩展),因此仅使用另一个扩展来完成工作没有任何问题。

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

于 2008-10-22T18:53:51.903 回答
1

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

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,并且将单数称为复数......但我想这只是挑剔。

于 2008-10-22T18:53:20.170 回答
1

我看不出有什么问题。假设您创建了一个 someClass.ToMySpecialString()。如果 someClass.ToString() 已经有多个重载,为什么不能重载它?

于 2008-10-22T18:54:28.797 回答