2010-01-02 34 views
27

Trong các bảng cơ sở dữ liệu khác nhau, tôi có cả thuộc tính và cột giá trị. Tôi đang sử dụng LINQ to SQL để truy cập cơ sở dữ liệu.Tại sao tôi nhận được "lỗi: ... phải là một loại tham chiếu" trong phương pháp chung C# của tôi?

Tôi đang viết một phương pháp mà trả về một từ điển chứa các thuộc tính/giá trị lấy từ các bảng cơ sở dữ liệu đưa ra:

private static Dictionary<string, string> GetProperties<T>(Table<T> table) 
{ 
    Dictionary<string, string> properties = new Dictionary<string, string>(); 

    foreach (var row in table) 
    { 
     properties[row.Property]=row.Value; 
    } 

    return properties; 
} 

Khi biên soạn, tôi nhận được:

Error 1 The type 'T' must be a reference type in order to use it as parameter 'TEntity' in the generic type or method 'System.Data.Linq.Table<TEntity>'

Tôi đã thử tìm kiếm thông báo lỗi này mà không gặp may.

Tìm kiếm StackOverflow, câu hỏi này có vẻ tương tự, mặc dù liên quan đến tham số Danh sách: Generic List<T> as parameter on method - mặc dù tham số vẫn không phải là loại tham chiếu trong câu trả lời cho câu hỏi đó.

Đọc Hướng dẫn lập trình C# trên MSDN: http://msdn.microsoft.com/en-us/library/twcad0zb(VS.80).aspx Tôi thấy các ví dụ của chúng đều chuyển các tham số theo tham chiếu. Tuy nhiên, tôi không thể xem làm thế nào để vượt qua bằng cách tham chiếu trong trường hợp cụ thể của tôi, vì loại chung là chỉ để xác định loại chung của Bảng.

Bất kỳ con trỏ nào cũng sẽ được đánh giá cao.

PS: Ứng dụng nếu cần thời gian để tôi chấp nhận câu trả lời vì tính năng này hiện không thể truy cập được (tôi bị mù và sử dụng trình đọc màn hình).

+0

Những dòng là thông báo lỗi chống lại? – sblom

+4

@Mahesh: Bạn đã đọc dòng cuối cùng của bài đăng chưa? @Saqib: Bạn có thể muốn gửi một ghi chú tới những người dùng StackOverflow về điều đó. Tôi chắc chắn họ sẽ muốn biết rằng một tính năng quan trọng của trang web của họ bị hỏng và không hoạt động đối với một phân đoạn đáng kể khách truy cập của họ. –

+1

Xin lỗi, tôi không biết. Cảm ơn bạn đã chỉ ra. Xin lỗi –

Trả lời

59

Điều này xảy ra vì cách Table<T> bị tuyên bố:

public sealed class Table<TEntity> : IQueryable<TEntity>, 
    IQueryProvider, IEnumerable<TEntity>, ITable, IQueryable, IEnumerable, 
    IListSource 
where TEntity : class // <-- T must be a reference type! 

Trình biên dịch được phàn nàn bởi vì phương pháp của bạn không có những hạn chế về T, có nghĩa là bạn có thể chấp nhận một T mà không phù hợp với các đặc điểm kỹ thuật của Table<T>.

Do đó, phương pháp của bạn cần ít nhất là nghiêm ngặt về những gì nó chấp nhận. Hãy thử điều này thay vì:

private static Dictionary<string, string> GetProperties<T>(Table<T> table) where T : class 
21

Chỉ thêm ràng buộc where T : class vào khai báo phương pháp của bạn.

Điều này là bắt buộc vì Table<TEntity> có giới hạn where TEntity : class. Nếu không, phương thức chung của bạn có thể được gọi với tham số kiểu struct, sẽ yêu cầu CLR khởi tạo Table<TEntity> với tham số kiểu struct đó, sẽ vi phạm ràng buộc trên Table<TEntity>.

0
public class TEntityRepository<TEntity> : EFRepository<TEntity> , ITEntityRepository<TEntity> 
    where TEntity : class, new() 
{ 
} 
Các vấn đề liên quan