У меня есть универсальный тип Store<T>
, и я использую 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<T>
методам, которые, как я знаю, находятся в объекте x
?
obvious
причину более очевидной? Или просто скажите нам, в чем причина. Или вы действительно имеете в видуtypeof...
, не подставляя его на свой тип? - person Snowbear   schedule 04.02.2012Store<someObjectThatImplementsIStorable>
. Таким образом, активатор создает правильный объект, но упаковывает его вobject
, и теперь я хотел бы снова его распаковать. - person Bazzz   schedule 04.02.2012object
, и теперь я хотел бы его понизить (или что-то в этом роде). - person phoog   schedule 05.02.2012