Tôi có các tình huống sau:Gọi một phương pháp chung với nguồn gốc đúng loại
tôi có ba lớp học, chúng ta hãy gọi chúng A
, B
và C
. Tất cả chúng có điểm chung là chúng kế thừa từ cùng một giao diện, ISomeInterface
và chúng là các lớp được ánh xạ tới các thực thể bằng cách sử dụng Entity Framework.
Tôi có phương thức nhận danh sách đối tượng triển khai giao diện này, nhưng bản thân đối tượng sẽ là các trường hợp A
, B
hoặc C
.
Phương pháp vỏ trông như thế này
public void MyMethod(List<ISomeInterface> entityList)
{
foreach(var entity in entityList)
{
ProcessEntity(entity);
}
}
Bây giờ, vấn đề là với phương pháp ProcessEntity
. Đây là một phương pháp chung chung, mà cần phải lấy lại bảng phù hợp với các yếu tố từ cơ sở dữ liệu tùy thuộc vào loại hay tổ chức nào, vì vậy nó trông như thế này:
public void ProcessEntity<T>(T entity)
{
using(var repository = new DbRepository())
{
var set = repository.Set<T>();
...
}
}
Vấn đề là dòng var set = repository.Set<T>();
thất bại vì T
là ISomeInterface
trong trường hợp này, và không phải là loại thực tế (A
, B
hoặc C
), do đó, nó đưa ra một ngoại lệ không thể liên quan đến loại đã cho, điều này là dễ hiểu.
Vì vậy, câu hỏi của tôi là: Làm thế nào tôi có thể gọi ProcessEntity với loại thực tế của đối tượng bên trong danh sách, và không phải là interfacetype mà họ thực hiện.
Điều đó đã làm điều đó. Tôi thay đổi 'ProcessEntity (obj);' thành 'ProcessEntity (obj thành dynamic);', và nó đã làm việc tốt. Sử dụng cho năng động mà tôi không biết.Cảm ơn rất nhiều :) –
@ ØyvindKnobloch-Bråthen yep, tôi thích kiểu thời gian chạy này rất nhiều –