2008-11-11 2 views
11

У меня есть класс ReportingComponent<T>, который имеет конструктор:Создать экземпляр Generic класса на основе анонимного типа

public ReportingComponent(IQueryable<T> query) {} 

У меня есть Linq запрос к базе данных Northwind,

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

Запрос имеет тип 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); 

EDIT: Причина мы нужен не общий тип, так это то, что вывод типа встречается только для общих методов - то есть метод, который вводит новый параметр типа. Мы не можем поместить это в общий тип, поскольку нам все равно придется указывать общий тип, чтобы вызвать метод, который поражает всю точку :)

У меня есть blog post, который входит в более подробно.

+0

При попытке компиляции я получаю сообщение об ошибке: Невозможно найти тип или имя пространства имен 'T' (вам не хватает директивы using или ссылки на сборку?) Кажется, что он все еще не может вывести тип T :( – 2008-11-11 07:45:24

Смежные вопросы