2012-06-27 19 views
19

Tengo una superclase a la que podemos llamar class A y algunas subclases, p. Ej. class a1 : A, class a2 : A, ... y a6 : A. En mi class B, tengo un conjunto de métodos que crea y agrega una de las subclases a List<A> en B.C# create Object obj = new T()?

Quiero acortar mi código que tengo en este momento. Así que en lugar de escribir

Adda1() 
{ 
    aList.Add(new a1()); 
} 

Adda2() 
{ 
    aList.Add(new a2()); 
} 

... 

Adda6() 
{ 
    aList.Add(new a6()); 
} 

lugar quiero escribir algo similar a esto

Add<T>() 
{ 
    aList.Add(new T()); // This gives an error saying there is no class T. 
} 

¿Es posible?

¿También es posible restringir que T tenga que ser del tipo A o una de sus subclases?

+0

posible duplicado de [Crear instancia de tipo genérico?] (Http://stackoverflow.com/questions/731452/create-instance- of-generic-type) –

Respuesta

32

La respuesta de Lee es correcta.

La razón es que con el fin de ser capaz de llamar a new T() es necesario agregar una restricción new() a su parámetro de tipo:

void Add<T>() where T : new() 
{ 
    ... new T() ... 
} 

También es necesario una restricción T : A de modo que usted puede agregar el objeto de tipo T a List<A>.

Nota: Cuando se utiliza junto con otros new() contraints, la restricción debe venir new()última.

relacionada

+0

Gracias. Esto significa que puedo pasar la clase 'A' como una restricción de tipo. ¿Hay alguna forma de que pueda hacer que solo sea posible pasar subclases de 'A' como restricción? – sehlstrom

+0

@sehlstrom: No, pero puede probar eso en tiempo de ejecución si lo desea y lanzar una excepción si alguien pasa un objeto de tipo 'A'. También es posible que desee considerar la realización de 'A'. –

+0

Greate! Entonces, si 'A' es abstracto, ¿no puedo pasarlo? O puedo pasarlo, pero no seré capaz de crear una instancia? – sehlstrom

26
public void Add<T>() where T : A, new() 
{ 
    aList.Add(new T()); 
} 
+0

Para obtener más información, consulte http: // msdn .microsoft.com/es-us/library/twcad0zb. – SirPentor

+0

¡Gracias, salvó el día! – idok