Possible Duplicate:
Why do I get “error: … must be a reference type” in my C# generic method?Cách tạo phương thức chung chung khi "loại 'T' phải là loại tham chiếu"?
tôi có 2 phương pháp Repository rằng gần như giống hệt nhau:
public IList<Fund> GetFundsByName(int pageSize, string searchExpression)
{
return _session.CreateCriteria<Fund>()
.AddNameSearchCriteria<Fund>(searchExpression)
.AddOrder<Fund>(f => f.Name, Order.Asc)
.SetMaxResults(pageSize).List<Fund>();
}
public IList<Company> GetCompaniesByName(int pageSize, string searchExpression)
{
return _session.CreateCriteria<Company>()
.AddNameSearchCriteria<Company>(searchExpression)
.AddOrder<Company>(f => f.Name, Order.Asc)
.SetMaxResults(pageSize).List<Company>();
}
Sự khác biệt duy nhất là cái đầu tiên của _session.CreateCriteria
là loại Fund
và điều thứ hai là company
Tôi đã hy vọng tôi có thể làm cho điều này bằng cách thay đổi định nghĩa phương thức thành:
public IList<T> GetEntitiesByName<T>(int pageSize, string searchExpression)
where T : ISearchableEntity
{
return _session.CreateCriteria<T>()
.AddNameSearchCriteria<T>(searchExpression)
.AddOrder<T>(f => f.Name, Order.Asc)
.SetMaxResults(pageSize).List<T>();
}
nơi ISearchableEntity được định nghĩa là:
public interface ISearchableEntity
{
string Name { get; set; }
}
nhưng tiếc NHibernate không thích điều này và mang lại cho tôi những lỗi:
The type 'T' must be a reference type in order to use it as parameter 'T' in the generic type or method 'NHibernate.ISession.CreateCriteria<T>()'
Có thể cho tôi để làm cho điều này chung một số khác đường?
đang 'Fund' và' Lớp học Company'? – AllenG
@AllenG, vâng, Quỹ & Công ty là các lớp học – DaveDev
Cũng có thể xem hàm chức năng CreateCriteria sourcecode và xem cách chúng hạn chế nó thành kiểu tham chiếu và có lẽ bạn có thể sử dụng cùng phương pháp để hạn chế kiểu chung của bạn thành kiểu tham chiếu. – AaronLS