如何通过扩展方法隐藏成员方法

时间:2011-01-11 07:31:10

标签: c# .net

public static class MyClass
{
    public static void Add<T>(this List<T> list, T item)
    {
        list.Add(item);
        Console.WriteLine(item.ToString());
    }
}

然后

List<string> list = new List<string>(){"1","2"};
list.Add("3");

但会调用成员方法。

有没有以这种方式打电话给我Extension Method

我不想这样称呼它:

MyClass.Add(list, item)

2 个答案:

答案 0 :(得分:10)

你做不到。假设它们适用,实例方法总是优先于扩展方法。成员解析只有在找不到非扩展方法选项时才会考虑扩展方法。

我建议你简单地重命名你的方法 - 除非重点是用现有的代码透明地调用这个方法。

如果您使用IList<T>代替List<T>,则可以创建一个实现IList<T>的包装类型,并将所有调用委托给包装列表,执行任何额外的任务走。然后,您可以向创建包装器的IList<T>编写扩展方法 - 在某些情况下,这将允许更流畅的语法。我个人更喜欢使用包装器方法来派生新的集合类型,因为这意味着您可以将它与现有集合一起使用,使代码更改可能更小......但这一切都取决于您尝试做什么。

答案 1 :(得分:7)

实例方法总是优先于扩展方法,所以没有。

正确的在这里做的事情似乎是多态性 - 但请注意List<T>不提供virtual方法。 Collection<T>确实如此:

using System;
using System.Collections.ObjectModel;
class MyClass<T> : Collection<T> {
    protected override void InsertItem(int index, T item) {
        base.InsertItem(index, item);
        Console.WriteLine("Added:" + item.ToString());
    }
    protected override void SetItem(int index, T item) {
        base.SetItem(index, item);
        Console.WriteLine("Set (indexer):" + item.ToString());
    }
    // see also ClearItems and RemoveItem
}