C# IList和IEnumerable上同名的扩展方法?

C# IList和IEnumerable上同名的扩展方法?,c#,.net,extension-methods,C#,.net,Extension Methods,我编写了一个IEnumerable和一个IList转换成字符串的程序。现在,由于IList继承了IEnumerable,因此我必须对它们进行不同的命名 我只是想知道是否有办法避免这种情况? 我可以在IEnumerable上使用扩展方法,然后在IList上使用具有相同名称和相同签名的不同方法吗?有点像重写,只是扩展方法当然是静态的 我只想在列表上使用一个更有效的方法体,而不必有第二个方法名 是的,我知道在这种特殊情况下,我应该先运行一个分析器,看看第二种方法是否更好,但我感兴趣的是,在派生类中是否

我编写了一个IEnumerable和一个IList转换成字符串的程序。现在,由于IList继承了IEnumerable,因此我必须对它们进行不同的命名

我只是想知道是否有办法避免这种情况? 我可以在IEnumerable上使用扩展方法,然后在IList上使用具有相同名称和相同签名的不同方法吗?有点像重写,只是扩展方法当然是静态的

我只想在列表上使用一个更有效的方法体,而不必有第二个方法名


是的,我知道在这种特殊情况下,我应该先运行一个分析器,看看第二种方法是否更好,但我感兴趣的是,在派生类中是否可以覆盖扩展方法。

为什么不像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
}
公共静态字符串Foo(此IEnumerable源代码)
{
var list=源为IList;
如果(列表!=null)
{
//使用更高效的算法和返回
}
//默认为基本算法
}

如果绝对必须有两个同名的独立扩展方法,那么可以将它们放在两个不同名称空间的类中,但这意味着您永远不能在同一个代码文件中同时使用它们,因此这很难达到最佳效果。

Daniel Cazzulino最近写了一篇关于模拟扩展方法的博客,在文章中,描述了他的方法,该方法不仅将类似名称空间的分组应用于相关的扩展方法,而且还描述了如何从本质上实现扩展属性。内心充满了敬畏

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

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

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

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

有趣的方法,这会起作用-您知道BCL在哪里做这件事吗?
Enumerable.Count()
做这件事-它检查
ICollection
并使用
.Count
作为快捷方式。