List<T> Foo<T>(Ilist list)
where T : ??
¿hay alguna manera de hacer cumplir T para ser
una de las pocas clases?donde t: múltiples clases
el tiempo que quiero hacer un interruptor en T ..
gracias.
List<T> Foo<T>(Ilist list)
where T : ??
¿hay alguna manera de hacer cumplir T para ser
una de las pocas clases?donde t: múltiples clases
el tiempo que quiero hacer un interruptor en T ..
gracias.
Aplicar una restricción de tipo de esta manera indica que esas varias clases están relacionadas con una funcionalidad común.
debe implementar una interfaz común y luego restringir el tipo de interfaz que:
public interface IUseful
{
public void UsefulMethod();
}
List<T> Foo<T>(IList list) where T : IUseful
{
// You now have access to all common functionality defined in IUseful
}
La ventaja añadida es que ahora no tiene que cambiar en T
para implementar diferentes comportamientos. Puede hacer que los hijos de IUseful
implementen sus propios comportamientos y luego los llame por su cuenta.
He estado buscando algo similar. Estoy de acuerdo en que una interfaz común es la mejor solución. Aunque actualmente estoy usando dos bibliotecas, y no puedo cambiar su código para usar la interfaz común. Entonces, ¿hay una manera de hacer esto sin una interfaz? –
En este caso, T podría ser una clase base común o una interfaz que los objetos de la lista comparten. Podría tener List<IFoo>
, y la lista podría contener las clases Foo, Bar, and Baz
si implementan la interfaz IFoo
. A falta de usar la herencia, estarías atrapado con una lista de objetos.
Puede requerir que cada clase que desea permitir en su lista implemente alguna interfaz ISomething
y luego crear una List<ISomething>
.
el tiempo que quiero hacer un interruptor en T ..
En lugar de un interruptor del tipo del objeto que podría ser mejor tener un método en su interfaz y poner en práctica de manera diferente para cada clase.
+1 para el comentario sobre no activar el tipo. – Ian
+1 Esto fue lo que vine a publicar. –
Por lo que yo sé, esto no es posible. Recomendaría derivar su conjunto limitado de clases de una clase base o interfaz común.
¿Qué es lo que quieres? Después de dos puntos, puede enumerar los tipos a los que restringe T
a.
Para múltiples clases, tal vez la implementación de una interfaz genérica y la configuración de su restricción podría hacer el truco.
favor vistazo a este enlace para más detalles: Constraints on Type Parameters (C# Programming Guide)
Son aquellos 'pocos classes' relacionados o ¿Comparten una clase base común o interfaz que implementan todas ellas? –
Solo tenga en cuenta que a veces puede ir demasiado lejos con los genéricos. He estado trabajando en algo recientemente y tenía una estructura genérica compleja donde tenía ClassA
donde P
, S. Todo fue agradable y genérico, pero terminó siendo sobre ingeniería y no pude usarlo de manera efectiva. En cambio, tuve que dividir el código de 3 maneras y aceptar repetir código similar en diferentes clases. –
Ian
Aquí hay una regla general rápida: si piensas en hacer 'cambiar' en 'T', o incluso consultarlo con un 'si', estás haciendo mal los genéricos. Da un paso atrás y calcula cómo. – Kobi