IList和IEnumerable上的扩展方法具有相同的名称?

时间:2010-01-04 20:39:21

标签: c# .net extension-methods

我已编写some extension Methods将IEnumerable和IList转换为字符串。现在,由于IList继承自IEnumerable,我必须以不同的方式命名它们。

我只是想知道是否有办法避免这种情况? 我可以在IEnumerable上使用扩展方法,然后在具有相同名称​​和相同签名的IList上使用另一个方法吗?有点像覆盖,除了扩展方法当然是静态的。

我只想在List上使用更有效的方法体,而不必使用第二个方法名称。

是的,我知道在这个特定的情况下,我应该首先运行一个探查器,以确定第二种方法是否更好,但我很感兴趣,如果它通常可以覆盖派生类中的扩展方法。

2 个答案:

答案 0 :(得分: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
}

如果你绝对必须有两个具有相同名称的独立扩展方法,你可以将它们放在两个不同命名空间的类中,但这意味着你永远不能在同一个代码中使用它们文件,这几乎不是最佳的。

答案 1 :(得分:4)

Daniel Cazzulino最近发表了关于模拟扩展方法的博客,并在帖子中描述了他的方法,不仅将类似命名空间的分组应用于相关的扩展方法,还描述了如何实质上实现扩展属性。 Here's the blog post.内部充满了令人敬畏的精神。

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

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

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

您可以使用此技术“命名”扩展方法。