Tengo un tipo genérico Store<T>
y uso Activator
para hacer una instancia de este tipo. Ahora, ¿cómo, después de usar el Activador, puedo convertir el objeto resultante del tipo object
al tipo instanciado? Sé el tipo que utilicé para crear una instancia del genérico. Por favor, vea el siguiente código:Cómo usar Activator para crear una instancia de un Tipo genérico y devolverlo a ese tipo?
class Store<T> where T : IStorable
{}
class Beer : IStorable
{}
class BeerStore : Store<Beer>
{}
Type storeType = someObjectThatImplementsIStorable.GetType();
Type classType = typeof(Store<>);
Type[] typeParams = new Type[] { storeType };
Type constructedType = classType.MakeGenericType(typeParams);
object x = Activator.CreateInstance(constructedType, new object[] { someParameter });
Lo que me gustaría hacer es algo como esto:
var store = (Store<typeof(objectThatImplementsIStorable)>)x;
pero eso no funciona por razones obvias. Como alternativa Traté:
var store = (Store<IStorable>)x;
que podría posiblemente trabajar en mi opinión, pero da una InvalidCastException
.
¿Cómo obtengo acceso de nuevo a los métodos Store<T>
que sé que están en el objeto x
?
¿Se puede hacer 'obvious' razón más obvia? O sólo nos dicen cuál es la razón. ¿O es que realmente quiere decir' 'typeof ... , no sustituyéndolo por tu tipo? – Snowbear
@Snowbear ese fragmento de código no se compila porque los genéricos no permiten que las instancias de tipos se usen como T. No conozco ese tipo, podría ser cualquier objeto que implemente el Interfaz IStorable – Bazzz
¿Qué tipo de depurador cree que es x? ¿Es el tipo correcto? – CarneyCode