Как использовать Activator для создания экземпляра универсального типа и преобразования его обратно в этот тип?

У меня есть общий тип Store и я использую Activator , чтобы создать экземпляр этого типа. Теперь, как после использования Activator я могу привести полученный объект типа object обратно к экземпляру типа? Я знаю тип, который использовал для создания экземпляра универсального. Пожалуйста, посмотрите следующий код:

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 });

Я бы хотел сделать что-то вроде этого:

var store = (Store<typeof(objectThatImplementsIStorable)>)x;

но это не работает по очевидным причинам. В качестве альтернативы я попробовал:

var store = (Store<IStorable>)x;

, который, на мой взгляд, мог бы работать, но выдает исключение InvalidCastException .

Как мне снова получить доступ к методам Store , которые, как я знаю, находятся в объекте x ?

36
задан Bazzz 4 February 2012 в 12:35
поделиться