Si no sé el tipo de en tiempo de compilación, pero desea que el tipo real (es decir, no List<object>
) y no estás en un método genérico/tipo con el parámetro de tipo apropiado, entonces usted tiene que utilizar la reflexión.
para hacer más sencillo el reflejo , A veces introduje un nuevo tipo o método genérico en mi propio código, así que puedo llamarlo por reflexión, pero el n solo use genéricos normales después de eso. Por ejemplo:
object x = GetObjectFromSomewhere();
// I want to create a List<?> containing the existing
// object, but strongly typed to the "right" type depending
// on the type of the value of x
MethodInfo method = GetType().GetMethod("BuildListHelper");
method = method.MakeGenericMethod(new Type[] { x.GetType() });
object list = method.Invoke(this, new object[] { x });
// Later
public IList<T> BuildListHelper<T>(T item)
{
List<T> list = new List<T>();
list.Add(item);
return list;
}
Por supuesto, no se puede hacer un montón con la lista después si usted no sabe el tipo ... es por eso que este tipo de cosas a menudo cae hacia abajo. Sin embargo, no siempre - He usado algo como el anterior en algunas ocasiones, donde el sistema de tipos simplemente no me deja expresar todo lo que necesito de forma estática.
EDITAR: Tenga en cuenta que aunque estoy llamando a Type.GetMethod en el código anterior, si iba a ejecutarlo mucho, probablemente querría simplemente llamarlo una vez; después de todo, el método no funciona cambiar. Es posible que pueda hacerlo estático (podría hacerlo en el caso anterior) y probablemente también desee hacerlo privado. Lo dejé como un método de instancia pública para la simplicidad de la llamada a GetMethod en el código de muestra; de lo contrario, necesitaría especificar los indicadores de enlace apropiados.
Puede devolver un IList no genérico (que es compatible con List <>), entonces la lista devuelta sería de utilidad. – configurator
En cuyo caso, sería más sencillo utilizar una ArrayList para empezar. –
ah, pero agregando el tipo incorrecto a la colección cuando se lanza como IList todavía a través de una excepción sobre si es del tipo incorrecto, ¿verdad? – Sekhat