Создать экземпляр общего класса на основе анонимного типа - PullRequest
13 голосов
/ 11 ноября 2008

У меня есть класс ReportingComponent<T>, у которого есть конструктор:

public ReportingComponent(IQueryable<T> query) {}

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

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

Запрос имеет тип IQueryable<a'>, где a 'является анонимным типом.

Я хочу передать запрос ReportingComponent для создания нового экземпляра.

Каков наилучший способ сделать это?

С уважением.

1 Ответ

18 голосов
/ 11 ноября 2008

Напишите универсальный метод и используйте вывод типа. Я часто нахожу, что это хорошо работает, если вы создаете статический неуниверсальный класс с тем же именем, что и у общего:

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

Тогда в другом своем коде вы можете позвонить:

var report = ReportingComponent.CreateInstance(query);

РЕДАКТИРОВАТЬ: причина, по которой нам нужен неуниверсальный тип, заключается в том, что вывод типа происходит только для универсальных методов - т.е. метода, который вводит новый параметр типа. Мы не можем поместить это в универсальный тип, так как нам все еще нужно было бы указать универсальный тип для вызова метода, который побеждает весь смысл:)

У меня есть запись в блоге , в которой более подробно.

...