2010-02-04 19 views
6

Estoy tratando de crear una lista genérica de objetos usando la reflexión. El código siguiente arroja un error No se puede crear una instancia de una interfaz.. Podría cambiar IList a List y funciona bien, pero me preguntaba si hay alguna forma de que funcione con un IList.Creando una instancia de IList genérica usando la reflexión

var name = typeof (IList<T>).AssemblyQualifiedName; 

    Type type = Type.GetType(name); 

    var list = Activator.CreateInstance(type); 
+0

typeof (IList ) devuelve el mismo tipo que la expresión en la segunda línea (Type.GetType (name);) en otras palabras, simplemente haga var type = typeof (tipo) cuando necesite el objeto System.Type para ese tipo particular –

Respuesta

7

tendrá que instatiate una clase concreta por lo que si lo hace

var type = Type.GetType(typeof (List<T>).AssemblyQualifiedName); 
var list = (Ilist<T>)Activator.CreateInstance(type); 

usted será exitosa (siempre y cuando se proporcione un valor válido para T, por supuesto).

+0

No se puede simplemente hacer: var list = (IList ) Activator.CreateInstance (typeof (List )); ??? –

+0

sí puede, tomé el largo camino para hacerlo más cercano al fragmento OPs –

6

Activator.CreateInstance método invoca el constructor predeterminado para crear una instancia del tipo pasado como parámetro. Este tipo tiene que ser no abstracto y no tener interfaz y tener un constructor predeterminado para que esta función tenga éxito.

2

Bueno, eso es imposible. El mensaje de error es claro como el cristal. No puedes crear una instancia de una interfaz.

¿Cómo sabría qué clase específica desea una instancia de? A menudo, muchas clases implementan la misma interfaz. ¿Debería elegir uno al azar? ;-)

Esto no tiene nada que ver con la reflexión, ya que tampoco sería capaz de "crear instancias" de una interfaz. Solo asigne objetos que implementen la interfaz y luego pase la referencia de la interfaz.

9

No, no es posible crear una instancia de una interfaz.

¿Cómo debe .NET (o más bien el método Activator.CreateInstance) decidir qué implementación de esa interfaz debe instanciar?

No se puede hacer:

IList<int> l = new IList<int>(); 

bien, ¿verdad? No se puede instanciar una interfaz, ya que una interfaz es una definición o contrato que describe qué funcionalidad debe implementar un tipo.

3

No creo que pueda hacer que esto funcione, porque no sabe qué tipo de objeto necesita crear.

Tendrá el mismo problema con una clase abstracta.

2

Obviamente no se puede instanciar un objeto del tipo IList<T> directamente porque es un tipo de interfaz.

Debe intentar instanciar un List<T> y luego devolverlo como IList<T>.

2
IList<T> Create<T>() 
{ 
    Type baseListType = typeof(List<>); 
    Type listType = baseListType.MakeGenericType(typeof(T)); 
    return Activator.CreateInstance(listType) as IList<T>; 
} 
+0

Su fragmento está defectuoso. typeof (int) debe ser typeof (T). Deberías tratar de compilarlo y ejecutarlo. No lo he hecho, pero de nuevo no necesito decir que está mal. Solucionarlo y arreglar el voto. ;-) –

+0

¡tienes razón! fijo. –

0

Bueno, PUEDES crear una interfaz en C#. Pero solo si realmente le dices cómo hacerlo.

Mira http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.coclassattribute.aspx y http://blogs.msdn.com/brada/archive/2004/10/10/240523.aspx

En su caso, sin embargo, parece que usted ha entendido mal cómo el trabajo de las interfaces.

Basta con crear una lista y luego regresar un IList <T> y su código de llamada no va a cuidar de que en realidad se está utilizando una lista <T>.

Cuestiones relacionadas