public static class MyClass
{
public static void Add<T>(this List<T> list, T item)
{
list.Add(item);
Console.WriteLine(item.ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
然后
List<string> list = new List<string>(){"1","2"};
list.Add("3");
Run Code Online (Sandbox Code Playgroud)
但是会调用成员方法.
反正有没有打电话给我Extension Method?
我不想这样称呼它:
MyClass.Add(list, item)
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 10
你不能.假设它们适用,实例方法总是优先于扩展方法.成员解析只有在找不到非扩展方法选项时才会考虑扩展方法.
我建议您只需重命名您的方法 - 除非重点是使用现有代码透明地调用此方法.
如果你创建它IList<T>而不是List<T>,你可以创建一个包装器类型,它实现IList<T>并将所有调用委托给包装列表,随时执行任何额外的任务.然后,您还可以编写一个IList<T>创建包装器的扩展方法- 在某些情况下,这将允许更流畅的语法.我个人更喜欢使用包装器方法来派生新的集合类型,因为这意味着您可以将它与现有集合一起使用,使代码更改可能更小......但这一切都取决于您尝试做什么.
实例方法总是优先于扩展方法,所以没有.
这里正确的做法似乎是多态 - 但请注意,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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2126 次 |
| 最近记录: |