2010-06-29 20 views
6
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.

+0

Son aquellos 'pocos classes' relacionados o ¿Comparten una clase base común o interfaz que implementan todas ellas? –

+3

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

+9

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

Respuesta

9

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.

+0

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? –

6

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.

15

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.

+0

+1 para el comentario sobre no activar el tipo. – Ian

+0

+1 Esto fue lo que vine a publicar. –

1

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.

2

¿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)

Cuestiones relacionadas