Domanda

Ho una classe ReportingComponent<T>, che ha il costruttore:

public ReportingComponent(IQueryable<T> query) {}

Ho una query Linq sul database Northwind,

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

La query è di tipo IQueryable<a'>, dove a 'è un tipo anonimo.

Voglio passare la query a ReportingComponent per creare una nuova istanza.

Qual è il modo migliore per farlo?

Cordiali saluti.

È stato utile?

Soluzione

Scrivi un metodo generico e usa l'inferenza del tipo. Trovo spesso che funzioni bene se crei una classe non generica statica con lo stesso nome di quella generica:

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

Quindi nell'altro codice puoi chiamare:

var report = ReportingComponent.CreateInstance(query);

EDIT: il motivo per cui abbiamo bisogno di un tipo non generico è che l'inferenza del tipo si verifica solo per i metodi generici, ovvero un metodo che introduce un nuovo parametro di tipo. Non possiamo inserirlo nel tipo generico, poiché dovremmo comunque essere in grado di specificare il tipo generico per chiamare il metodo, che sconfigge l'intero punto :)

Ho un post sul blog che fornisce ulteriori dettagli.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top