2008-11-11 3 views
11

나는 생성자가있는 클래스 ReportingComponent<T> 있습니다 :익명 유형을 기반으로 일반 클래스 인스턴스 만들기

public ReportingComponent(IQueryable<T> query) {} 

Northwind 데이터베이스,

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

에 대한 Linq 쿼리를 쿼리는 형식이 IQueryable<a'>, a '는 익명 형식입니다.

새 인스턴스를 만들려면 ReportingComponent에 쿼리를 전달하고 싶습니다.

이것을 수행하는 가장 좋은 방법은 무엇입니까?

종류에 관해서.

답변

16

일반적인 방법을 쓰고 형식 유추를 사용합니다.

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

그런 다음 다른 코드에서 당신이 호출 할 수 있습니다 :

var report = ReportingComponent.CreateInstance(query); 

편집 : 이유는 우리가 나는 종종이 당신이 일반적인 것과 같은 이름의 정적 제네릭이 아닌 클래스를 만드는 경우 잘 작동 발견 비 제네릭 타입이 필요하다. 타입 추론은 generic 메소드에 대해서만 발생한다. 즉, 새로운 타입 파라미터를 도입하는 메소드이다. 우리는 generic 형식을 사용할 수 없습니다.이 메서드를 호출하여 메서드 전체를 무효화하려면 generic 형식을 지정할 수 있어야합니다.

나는 blog post이 들어갑니다. 자세한 내용은.

+0

컴파일 할 때 오류가 발생합니다. 형식 또는 네임 스페이스 이름 'T'을 (를) 찾을 수 없습니다. 사용 지시문이나 어셈블리 참조가 없습니까? 여전히 T 유형을 추론 할 수없는 것 같습니다. –

+1

감사합니다. 자레드. 기차역에서 코드를 작성하는 데 문제가 있습니다. :) –

+0

하나의 질문에 왜 비 제너릭 클래스가 필요한가요? 제네릭 클래스에서만 작동하지 않는 이유는 무엇입니까? 형식 유추가 여전히 작동해야합니다. –