Tôi cố gắng giải quyết vấn đề tương tự xung quanh lớp bảng dữ liệu thay vì thư. Các vấn đề gốc được đề cập ở trên của đúc một phiên bản không chung chung của lớp để một phiên bản chung có nguồn gốc là như nhau.
Để cho phép tiêm vào thư viện lớp di động không hỗ trợ thư viện cơ sở dữ liệu, tôi đã giới thiệu một tập hợp các lớp giao diện, với mục đích tôi có thể vượt qua một loại và nhận được kết hợp chung. Nó đã kết thúc cần phải thực hiện một phương pháp chung chung.
// Interface for injection
public interface IDatabase
{
// Original, non-functional signature:
IDatatable<object> GetDataTable(Type dataType);
// Functional method using a generic method:
IDatatable<T> GetDataTable<T>();
}
Và điều này thực hiện toàn bộ bằng cách sử dụng phương pháp chung ở trên.
Lớp chung sẽ được truyền từ từ điển.
// Non-generic base class allows listing tables together
abstract class Datatable
{
Datatable(Type storedClass)
{
StoredClass = storedClass;
}
Type StoredClass { get; private set; }
}
// Generic inheriting class
abstract class Datatable<T>: Datatable, IDatatable<T>
{
protected Datatable()
:base(typeof(T))
{
}
}
Đây là lớp học mà các cửa hàng lớp generic và phôi nó để đáp ứng các phương pháp chung trong giao diện
class Database
{
// Dictionary storing the classes using the non-generic base class
private Dictionary<Type, Datatable> _tableDictionary;
protected Database(List<Datatable> tables)
{
_tableDictionary = new Dictionary<Type, Datatable>();
foreach (var table in tables)
{
_tableDictionary.Add(table.StoredClass, table);
}
}
// Interface implementation, casts the generic
public IDatatable<T> GetDataTable<T>()
{
Datatable table = null;
_tableDictionary.TryGetValue(typeof(T), out table);
return table as IDatatable<T>;
}
}
Và cuối cùng sự kêu gọi của phương pháp giao diện.
IDatatable<CustomerAccount> table = _database.GetDataTable<CustomerAccount>();
câu hỏi sau có một kịch bản đúc tránh sử dụng Generics - [Refactoring Mã để tránh Loại Đúc] (http://stackoverflow.com/questions/21482850/refactoring-code-to-avoid-type-casting) – Lijo