non must method generic extension custom c# methods extension-methods

c# - must - Restrinja el método de extensión genérico de extender cadenas



extension method must be defined in a non-generic static class (3)

Para empezar, se siente como un extraño requisito para ser honestos: si algo debería funcionar para cualquier secuencia de caracteres, entonces debería funcionar para una cadena, que es una secuencia de caracteres.

Si realmente desea que no se compile, puede agregar una string aceptación de sobrecarga que esté marcada como obsoleta:

[EditorBrowsable(EditorBrowsableState.Never)] [Obsolete(IsError = true, Message = "A string is a sequence of characters, but is not intended to be shown as a list")] public static void ShowList(this string text) { throw new NotSupportedException(); }

La resolución de sobrecarga elegirá ese método y luego no se compilará. Es de EditorBrowsable atributo EditorBrowsable elimine esto de Intellisense, pero tendrá que ver si realmente funciona. (Puede mostrar la otra sobrecarga aún, aunque no se haya recogido).

Otra opción sería implementar ShowList<T> como si la cadena fuera una lista de una sola entrada:

// Specialization to avoid listing each character separately. public static void ShowList(this string text) => new[] { text }.ShowList();

En otras palabras, haga que sea válido llamar, pero manejarlo más apropiadamente.

Tengo un método de extensión muy genérico para mostrar cualquier tipo de lista dentro de una consola:

public static void ShowList<T>(this IEnumerable<T> Values) { foreach (T item in Values) { Console.WriteLine(item); } }

No cuando tengo una string puedo usar este método

string text = "test"; text.ShowList();

Pero en caso de string no tiene sentido en mi aplicación.

¿Cómo puedo excluir la string de este método? He leído algo sobre

ShowList<T>(this IEnumerable<T> Values): Where != string //doesn''t work


Para ignorar en silencio puedes usar esto:

public static void ShowList<T>(this IEnumerable<T> Values) { if (Values is String) return; // ... }

O si también quieres escribir la cadena:

public static void ShowList<T>(this IEnumerable<T> Values) { if (Values is String) Console.WriteLine(Values); else foreach (T item in Values) { Console.WriteLine(item); } }


Puede crear otra sobrecarga de ShowList() que sea específica para la string y marcarla como [Obsolete] :

[Obsolete("Not intended for strings", true)] public static void ShowList(this string val) { }

Al pasarle true al parámetro IsError , el compilador le impedirá usar el método.

Ver ObsoleteAttribute