2008-11-11 36 views
11

Tôi có một lớp ReportingComponent<T>, trong đó có các nhà xây dựng:Tạo Generic Class dụ dựa trên Anonymous Loại

public ReportingComponent(IQueryable<T> query) {} 

Tôi có LINQ Query chống lại cơ sở dữ liệu Northwind,

var query = context.Order_Details.Select(a => new 
{ 
    a.OrderID, 
    a.Product.ProductName, 
    a.Order.OrderDate 
}); 

Query là loại IQueryable<a'> , trong đó 'là một loại ẩn danh.

Tôi muốn chuyển truy vấn đến ReportingComponent để tạo một phiên bản mới.

Cách tốt nhất để làm điều này là gì?

Trân trọng.

Trả lời

16

Viết phương pháp chung và sử dụng suy luận kiểu. Tôi thường thấy các công trình này tốt nếu bạn tạo ra một lớp nongeneric tĩnh với tên giống như chung một:

public static class ReportingComponent 
{ 
    public static ReportingComponent<T> CreateInstance<T> (IQueryable<T> query) 
    { 
    return new ReportingComponent<T>(query); 
    } 
} 

Sau đó, trong các mã khác của bạn, bạn có thể gọi:

var report = ReportingComponent.CreateInstance(query); 

EDIT: Lý do chúng tôi cần một loại không chung chung là suy luận kiểu chỉ xảy ra cho các phương thức chung - tức là một phương thức giới thiệu một tham số kiểu mới. Chúng tôi không thể đặt điều đó trong loại chung, vì chúng tôi vẫn phải có khả năng chỉ định loại chung để gọi phương thức, đánh bại toàn bộ điểm :)

Tôi có một số blog post biết thêm chi tiết.

+0

Khi cố gắng biên dịch, tôi nhận được lỗi: Không thể tìm thấy loại hoặc không gian tên 'T' (bạn thiếu một chỉ thị sử dụng hoặc tham chiếu assembly?) Dường như nó vẫn không thể suy ra kiểu T: ( –

+1

Cảm ơn Jared. Đó là vấn đề với việc viết mã trên các bậc của nhà ga xe lửa :) –

+0

Một câu hỏi, tại sao chúng ta cần lớp không chung chung? Tại sao nó không hoạt động với lớp chung? Type Inference vẫn hoạt động. –

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