2008-11-11 29 views
11

Oluşturucuya sahip bir ReportingComponent<T> sınıfım var:Anonim Tipe Dayalı Genel Sınıf Örneği Oluşturma

public ReportingComponent(IQueryable<T> query) {} 

Northwind Veritabanına karşı Linq Sorgusu var

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

Sorgu, bir 'anonim tip' olan IQueryable<a'> türüdür.

Yeni bir örnek oluşturmak için ReportingComponent öğesine sorgu aktarmak istiyorum.

Bunu yapmanın en iyi yolu nedir?

Saygılarımızla.

cevap

16

Genel bir yöntem yazın ve tür çıkarımını kullanın.

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

Sonra diğer kodda Arayabileceğin:

var report = ReportingComponent.CreateInstance(query); 

DÜZENLEME: nedeni Sık sık bu, genel olarak aynı adı taşıyan bir statik generic olmayan sınıf oluşturmak eğer iyi çalışır bulmak Jenerik olmayan bir türe ihtiyaç olması, bu tür çıkarımların yalnızca jenerik yöntemleri için - yani yeni bir tip parametresi sunan bir yöntem için gerçekleşmesidir. Bunu jenerik türüne koyamayız, çünkü genel olarak, tüm noktayı yenen yöntemi çağırmak için jenerik türünü belirtmek zorunda kalacağız :)

blog post daha fazla detay. Hatası alıyorum derlemek çalışıyor On

+0

: tür veya ad alanı adı 'T' bulunamadı (bir kullanarak yönergesi veya bir derleme başvurusu eksik?) T türünü tahmin edemediği hala görünüyor :( –

+1

Teşekkürler Jared. Bir tren istasyonunun basamaklarında kod yazarken problem var :) –

+0

Tek soru, neden jenerik olmayan sınıfa ihtiyacımız var? Neden sadece genel sınıfla çalışmıyor? Tür Çıkarımı hala çalışmalıdır. –

İlgili konular