2011-01-11 2 views
9
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) 
+1

Даже если 'list.Add (" 3 ")' переписывал 'List.Add' и называл ваш метод расширения, вы должны ожидать, что' list.Add (item) 'сделает то же самое, что приведет к бесконечной рекурсии. – Kobi

+0

Я вижу, мой вопрос - это всего лишь вопрос любопытства, и я предоставляю пример кода, чтобы показать, что я хочу, тем не менее вы правы –

ответ

8

Вы не можете. Методы экземпляра всегда имеют преимущество над методами расширения, если они применимы. Разрешение члена будет рассматривать методы расширения только после того, как ему не удастся найти опцию без расширения.

Я бы предложил вам просто переименовать свой метод - если бы точка не вызывала этот метод прозрачно с существующим кодом.

Если вы сделали это принять 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 
} 
+2

ploymorphism - это скрытая перегрузка? ;) –

+0

@Mitch - nice; p Исправлено. –

+0

, но перегрузка также называется 'ad hoc polymorphism', ничего страшного в этом –

Смежные вопросы