2009-05-27 8 views
13

Tengo una pregunta sobre cómo es posible (si es posible :) utilizar una referencia de tipo devuelta por Type.GetType() para, por ejemplo, crear IList de ese tipo?utilizando el tipo devuelto por Type.GetType() en C#

aquí es código de ejemplo:

Type customer = Type.GetType("myapp.Customer"); 
IList<customer> customerList = new List<customer>(); // got an error here =[ 

gracias de antemano!

+0

IList es una interfaz, por lo que no puede nuevo. Necesita un nuevo tipo que implemente IList como List . –

Respuesta

21

Algo como esto:

Type listType = typeof(List<>).MakeGenericType(customer); 
IList customerList = (IList)Activator.CreateInstance(listType); 

Por supuesto no se puede declarar como

IList<customer> 

porque no se define en tiempo de compilación. Pero List<T> implementa IList, por lo que puede usar esto.

+3

Sí, porque no está definido en tiempo de compilación, no tiene mucho sentido usar una Lista <> genérica, también podría usar un contenedor no genérico como ArrayList. – Grokys

+0

En realidad, debe lanzar el resultado de Activator.CreateInstance a IList, ya que devuelve un objeto ... –

+1

@Thomas: gracias, lo arregló. @Groky: depende. Al usar la lista genérica, obtienes verificaciones del tipo de tiempo de ejecución al agregar elementos. O necesita asignarlo a un campo que sabe (por algún contexto) que es del mismo tipo. –

0

La solución a su problema ya está provista por Stefan.

La razón por la que no puede hacer IList<customer> es porque no puede mezclar el tiempo de compilación y los tipos de tiempo de ejecución de esta manera. Una pista cuando trato de razonar sobre algo como esto es: ¿cómo puede intellisense averiguar qué miembros debe mostrar? En su ejemplo, esto solo puede resolverse en tiempo de ejecución.

Se puede usar la respuesta dada por Stefan. Sin embargo, creo que no ayuda en su problema subyacente, porque no le da inteligencia. Por lo tanto, creo que no tiene ninguna ventaja sobre el uso de una lista no genérica.

+0

Como Stefan señaló en los comentarios de su respuesta, todavía hay adelantos, como la lista genérica que impide que el código agregue objetos de diferentes tipos a la lista. Sin embargo, pierdes intellisense. –

2

Hace poco me enfrenté a este problema ... Me doy cuenta de que esta es una vieja pregunta, pero pensé que alguien podría encontrarle útil a la solución que encontré (usando net 4.0). Esta es la configuración que tenía:

public interface ISomeInterface{ 
    String GetEntityType{ get; } 
} 

public abstract class BaseClass : ISomeInterface{ 
    public String GetEntityType { 
      get{ return this.GetType().ToString(); } 
    } 
} 

public class ChildA : BaseClass { } 

public class ChildB : BaseClass { } 

Lo que hice fue crear un método de fábrica:

public static dynamic GetRealType { ISomeInterface param } { 
    return Activator.CreateInstance("dllname", param.GetEntityType); 
} 

Creación del objeto como un tipo dinámico fue lo resuelto por mí. Deduje el tipo por tener un método:

public void DoSomething<T>(T param){ 

    IList<T> list = somecode... 
} 

esto me permitió hacer una llamada al método y dejar .net inferir el tipo

public void myMethod(ISomeInterface param) { 
    dynamic value = Factory.GetRealType (param); 
    DoSomething(value); 
} 

esperanza no hice todo confuso y en realidad ayuda, también, lo siento por el muro de texto

Cuestiones relacionadas