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.