IList和IEnumerable上使用相同名称的扩展方法?

3
我编写了一些扩展方法,可以将IEnumerable和IList转换为字符串。由于IList继承自IEnumerable,所以我必须给它们命名不同的名称。
我想知道是否有一种方法可以避免这种情况?我可以在IEnumerable上有一个扩展方法,然后在IList上有一个相同名称相同签名的不同扩展方法吗?有点像覆盖,只是扩展方法当然是静态的。
我只想在列表上使用更有效的方法体,而不必使用第二个方法名称。
是的,我知道在这种特定情况下,我应该先运行分析器,以便真正看到第二种方法是否更好,但我想知道是否通常可能在派生类中覆盖扩展方法。
2个回答

5
为什么不像BCL一样,在同一个方法中尝试向下转换?类似这样:
public static string Foo<T>(this IEnumerable<T> source)
{
    var list = source as IList<T>;
    if(list != null)
    {
        // use more efficient algorithm and return
    }
    // default to basic algorithm
}

如果你一定要拥有两个同名的扩展方法,你可以将它们放在不同命名空间的类中,但这意味着你不能在同一个代码文件中同时使用它们,因此这并不是最优的解决方案。


有趣的方法,那应该行得通 - 你知道BCL在哪里做到了这一点吗? - Michael Stum
1
Enumerable.Count() 这个方法的作用就是检查是否有 ICollection<T> 接口,如果有就使用 .Count 作为一个快捷方式。 - Marc Gravell

4

丹尼尔·卡祖利诺最近在博客中写到了如何模拟扩展方法,并在文章中描述了他的方法,不仅将类似于命名空间的分组应用于相关的扩展方法,而且还描述了如何实现扩展属性。这是博客文章链接。其中包含了许多很棒的内容。

实质上,您可以将相关方法封装在一个对象中,并从扩展方法返回该对象的实例:

public interface ISecurity
{
    Permissions GetPermissions(Uri resource);
}

public static class SecurityExtensions
{
    public static ISecurity Security(this IPerson person)
    {
       return new SecurityImpl(person);
    }
}

您可以使用这种技术来将扩展方法进行“命名空间”划分。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接