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)
答案 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
}