明确使用扩展方法

时间:2009-06-12 16:07:07

标签: c# extension-methods

我有List<T>并希望以相反的顺序返回值。我不想要的是反转列表本身。

这似乎没问题,因为Reverse()的{​​{1}}扩展方法完全符合我的要求。

我的问题是,IEnumerable<T>还有Reverse()方法,它会反转列表本身并返回void。

我知道有很多以相反顺序遍历列表的方法,但我的问题是:

如何告诉编译器我想使用同名的扩展方法?

List<T>

5 个答案:

答案 0 :(得分:14)

明确绑定到特定扩展方法的最佳方法是使用共享方法语法调用它。在你的情况下,你会这样做:

DumpList(Enumerable.Reverse(list));

这里提到的其他一些方法的问题是它们并不总能做你想要的。例如,像这样强制转换列表:

((IEnumerable)list).Reverse()

最终可能会调用一个完全不同的方法,具体取决于您导入的命名空间,或者定义调用代码的类型。

唯一可以100%确定绑定到特定扩展方法的方法是使用共享方法语法。

答案 1 :(得分:9)

var list = new List<int>(new [] {1, 2, 3});
DumpList((list as IEnumerable<int>).Reverse());

OR

IEnumerable<int> list = new List<int>(new [] {1, 2, 3});
DumpList(list.Reverse());

答案 2 :(得分:2)

您无需强制转换参数以选择正确的方法......您只需要更具体地说明该方法。

List<int> list = new List<int>() {1, 2, 3};
DumpList(Enumerable.Reverse(list)); 

答案 3 :(得分:1)

这似乎有效

   var stuff = new List<int>();
   var list = Enumerable.Reverse(stuff);

答案 4 :(得分:0)

如果您不介意丑陋,并且您编写了扩展方法,则可以随时致电:

MyExtensions.Reverse(list);

它仍然只是一种静态的方法。我昨天想到了这一点,当ReSharper疯了,并决定重写我的一半扩展方法作为静态方法的调用。

至于使用IEnumerable&lt; T&gt;与列表&lt; T&gt;相比,它看起来并不那么简单。我的第一个想法是使用:

IEnumerable<T>.Reverse<T>(list);

但是这给了我一个编译器错误,John的答案对于IEnumerable / List是正确的。