2010-07-29 30 views
69

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?

+0

đang 'Fund' và' Lớp học Company'? – AllenG

+0

@AllenG, vâng, Quỹ & Công ty là các lớp học – DaveDev

+0

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

Trả lời

173

Bạn có thể thử thêm các hạn chế class:

where T : class, ISearchableEntity 
+2

Lúc đầu, tôi cho rằng điều này chỉ hoạt động nếu T phải là một Lớp, nhưng sau khi xem trang được liên kết trong câu trả lời của theburningmonk, tôi phát hiện ra rằng mặc dù tên của ràng buộc này, "điều này cũng áp dụng cho mọi lớp học, giao diện, đại biểu hoặc loại mảng. " Vì vậy, sử dụng 'where T: class' ngay cả khi bạn cần T là một giao diện, như trường hợp của tôi. –

+0

Điều này cũng hoạt động cho struct –

27

Dưới đây là danh sách đầy đủ của những hạn chế, bạn có thể sử dụng trên T

http://msdn.microsoft.com/en-us/library/d5x73970.aspx

+0

Cảm ơn bạn đã liên kết, rất giáo dục :) – gyurisc

+0

LƯU Ý: Nếu một người đang gọi một phương thức và nhận được lỗi này, Int32? (ví dụ:) sẽ không hoạt động như một loại tham chiếu, nhưng mảng Int32? [] sẽ hoạt động như vậy! – JosephDoggie

Các vấn đề liên quan