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

Jah*_*ine 11 .net c#

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>创建包装器的扩展方法- 在某些情况下,这将允许更流畅的语法.我个人更喜欢使用包装器方法来派生新的集合类型,因为这意味着您可以将它与现有集合一起使用,使代码更改可能更小......但这一切都取决于您尝试做什么.


Mar*_*ell 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
}
Run Code Online (Sandbox Code Playgroud)

  • 多态性 - 这是一个偷偷摸摸的超载?;) (2认同)