Tôi có mô hình khái niệm sau:Không thể đúc tượng chung
public interface IFoo<out T>
{
T Data { get; }
}
public struct Foo<T> : IFoo<T>
{
public Foo(T data) : this()
{
Data = data;
}
public T Data { get; private set; }
}
public class FooService<T>
{
...
public Foo<T> Get(string id)
{
...
}
}
Sau đó, tôi cố gắng sử dụng nó trong một cách mà khái niệm tương đương với điều này:
// Create and register a few FooService instances
ServiceLocator.Register(new FooService<DateTime>(), "someServiceId");
ServiceLocator.Register(new FooService<double?>(), "anotherServiceId");
// Retrieve a particular FooService instance and call the Get method
var fooService = (FooService<object>)ServiceLocator.Get("someServiceId");
var foo = fooService.Get("someFooId");
Tôi muốn sử dụng Get() phương thức trên một cá thể FooService - không có vấn đề gì kiểu FooService được chọn trả về. Tuy nhiên, mã này kết quả trong ngoại lệ sau đây:
Không thể cast đối tượng của loại 'WindowsFormsApplication7.FooService`1 [System.DateTime]' gõ 'WindowsFormsApplication7.FooService`1 [System.Object]'.
Bất kỳ đề xuất nào về cách giải quyết vấn đề này sẽ được đánh giá cao.
Bạn có thể tranh luận, tại sao tôi đã tạo FooService chung ở nơi đầu tiên. Tuy nhiên, điều này được thực hiện để bảo đảm an toàn loại trong một môi trường an toàn kiểu. Tuy nhiên, trong trường hợp cụ thể này, FooService sẽ được sử dụng trong bộ điều khiển Web API để phục vụ các loại Foo khác nhau. Nó sẽ trở lại một phản ứng với Foo của T bỏ qua các loại T.
bạn cũng cần một interface IFooServive whence your c ast là (IFooService