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

C# 如何通过扩展方法隐藏成员方法,c#,.net,C#,.net,实例方法总是优先于扩展方法,所以不是 这里要做的正确事情似乎是多态性——但请注意,List没有提供virtual方法集合执行以下操作: MyClass.Add(list, item) 使用系统; 使用System.Collections.ObjectModel; 类MyClass:集合{ 受保护的覆盖无效插入项(int索引,T项){ 基本插入项(索引,项目); Console.WriteLine(“添加:”+item.ToString()); } 受保护的覆盖无效集合项(整数索引,T项){ b

实例方法总是优先于扩展方法,所以不是

这里要做的正确事情似乎是多态性——但请注意,
List
没有提供
virtual
方法<代码>集合执行以下操作:

MyClass.Add(list, item)
使用系统;
使用System.Collections.ObjectModel;
类MyClass:集合{
受保护的覆盖无效插入项(int索引,T项){
基本插入项(索引,项目);
Console.WriteLine(“添加:”+item.ToString());
}
受保护的覆盖无效集合项(整数索引,T项){
base.SetItem(索引,项);
Console.WriteLine(“Set(indexer):”+item.ToString());
}
//另请参见ClearItems和RemoveItem
}

你不能。实例方法总是优先于扩展方法,假设它们是适用的。成员解析将只考虑一旦未能找到非扩展方法选项的扩展方法。

我建议您简单地重命名您的方法-除非关键是使用现有代码透明地调用此方法


如果使用
IList
而不是
List
,则可以创建一个包装器类型,该类型实现
IList
,并将所有调用委托给包装的列表,同时执行任何额外的任务。然后,您还可以编写一个扩展方法到
IList
,该方法创建了包装器-在某些情况下,这将允许更流畅的语法。就我个人而言,我更喜欢使用包装器方法来派生新的集合类型,因为这意味着您可以将其用于现有集合,从而使代码更改可能更小。。。但这一切都取决于你想做什么。

多态性-这是一个鬼鬼祟祟的过载吗?;)但是重载也被称为
特殊多态性
,即使
list.Add(“3”)
overwrite
list.Add
并调用扩展方法,你也应该期望
list.Add(item)
也这样做,从而产生无限递归。我明白了,我的问题只是一个好奇的问题,我提供了一个示例代码来说明我想要什么,尽管如此,您是对的
List<string> list = new List<string>(){"1","2"};
list.Add("3");
MyClass.Add(list, item)
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
}