2011-01-11 12 views
9
public static class MyClass 
{ 
    public static void Add<T>(this List<T> list, T item) 
    { 
     list.Add(item); 
     Console.WriteLine(item.ToString()); 
    } 
} 

continuaciónCómo ocultar un método miembro por un método de extensión

List<string> list = new List<string>(){"1","2"}; 
list.Add("3"); 

Sin embargo, el método de la barra sería llamado.

¿Hay alguna forma de llamar a mi Extension Method de esta manera?

no quiero llamarlo así:

MyClass.Add(list, item) 
+1

Incluso si 'list.Add (" 3 ")' sobrescribió 'List.Add' y llamó a su método de extensión, entonces debería esperar' list.Add (item) 'hacer lo mismo, lo que da como resultado una recursión infinita. – Kobi

+0

Veo, mi pregunta es solo una cuestión de curiosidad y proporciono un código de muestra solo para mostrar lo que quiero, sin embargo, tiene razón –

Respuesta

8

No puede. Los métodos de instancia siempre tienen prioridad sobre los métodos de extensión, suponiendo que sean aplicables. La resolución del miembro solo considerará los métodos de extensión una vez que no haya encontrado una opción que no sea de método de extensión.

Le sugiero que simplemente cambie el nombre de su método, a menos que el punto fuera llamar este método de forma transparente con el código existente.

Si usted lo hizo tomar una IList<T> en lugar de List<T>, se puede crear un tipo de envoltura que implementa IList<T> y delegados todas las llamadas en la lista envuelto, de realizar cualquier tarea adicional a medida que avanza. Luego puede también escribir un método de extensión a IList<T> que creó el contenedor, lo que permitiría una sintaxis más fluida en algunos casos. Personalmente, prefiero el enfoque de envoltorio para derivar un nuevo tipo de colección, ya que significa que puede usarlo con sus colecciones existentes, haciendo que el código cambie potencialmente más pequeño ... pero todo depende de lo que esté tratando de hacer.

+1

decorador de hecho tiene sentido –

7

Los métodos de instancia siempre tienen prioridad sobre los métodos de extensión, por lo que no.

El correcta que hay que hacer aquí parece ser el polimorfismo - pero tenga en cuenta que List<T> no proporciona virtual métodos. Collection<T> sí, sin embargo:

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 - ¿Es eso una sobrecarga furtiva? ;) –

+0

@Mitch - nice; p Fixed. –

+0

pero la sobrecarga también se llama 'polimorfismo ad hoc', no hay nada de malo en que –

Cuestiones relacionadas