Tôi có loại chung Store<T>
và sử dụng Activator
để tạo một phiên bản loại này. Bây giờ làm thế nào, sau khi sử dụng Activator, tôi có thể bỏ đối tượng kết quả của loại object
trở lại loại được khởi tạo không? Tôi biết loại mà tôi đã sử dụng để khởi tạo chung chung. Hãy xem đoạn mã sau:Làm thế nào để sử dụng Activator để tạo ra một thể hiện của một loại chung và đúc nó trở lại loại đó?
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 });
Những gì tôi muốn làm là một cái gì đó như thế này:
var store = (Store<typeof(objectThatImplementsIStorable)>)x;
nhưng điều đó không làm việc vì lý do rõ ràng. Thay vào đó, tôi đã thử:
var store = (Store<IStorable>)x;
có thể làm việc theo ý kiến của tôi, nhưng cung cấp InvalidCastException
.
Làm cách nào để tôi có quyền truy cập lại vào các phương thức Store<T>
mà tôi biết nằm trong đối tượng x
?
Bạn có thể làm 'lý do obvious' rõ ràng hơn? Hoặc chỉ cần cho chúng tôi biết là vì lý do gì. Hoặc bạn có thực sự có nghĩa là' typeof ... ' – Snowbear
@Snowbear rằng đoạn mã không biên dịch vì Generics không cho phép các cá thể của các kiểu được sử dụng như T. Tôi không biết kiểu đó, nó có thể là bất kỳ đối tượng nào thực hiện – Bazzz
Loại trình gỡ rối nghĩ x là gì? Nó có đúng loại không? – CarneyCode