题
我通常非常谨慎地使用扩展方法。当我觉得有必要编写扩展方法时,我有时想要重载该方法。我的问题是,您对扩展方法调用其他扩展方法有何看法?不好的做法?这感觉不对,但我无法真正定义原因。
例如,第二个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()已经有多个重载,你为什么不能重载它呢?
不隶属于 StackOverflow