У меня есть общий тип Store<T>
и используйте 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 ... , не заменяя его вашим типом? – Snowbear
@Snowbear, что часть кода не компилируется, потому что Generics не разрешают экземпляры типов использоваться как T. Я не знаю этого типа, это может быть любой объект, который реализует IStorable-интерфейс – Bazzz
Какой тип отладчика считает x? Правильный ли он? – CarneyCode