2013-08-08 14 views
13

Sto avendo una classe generica in cui ho una funzione per ottenere le proprietà dell'oggetto generico passato. È come di seguito.ottiene proprietà utilizzando le riflessioni per l'oggetto di tipo generico

public class ExportToCsv<T>   
     where T: class 
{ 
    public ExportToCsv(List<T> obj) 
    { 
      this.Data = obj;  
    } 

    public StringBuilder CreateRows() 
    { 
     IEnumerable<PropertyInfo> properties = typeof(T).GetProperties(); 
    } 
} 

Funziona bene e mi restituisce le proprietà se mi passate l'oggetto selezionando da un oggetto (classe) come di seguito

//GetLeadingRoutingRecords returns a class/object 
var result = from obj in GetLeadRoutingRecords() 
        select new 
        { 
         LeadRoutingId = obj.LeadRoutingID, 
         Make = obj.Make 
        }; 

e passare tale risultato come result.ToList();

ma quando provo per creare il mio oggetto anonimo creando una classe per le proprietà come sotto non funziona non restituisce alcuna proprietà

Nota: il codice seguente viene chiamato in un ciclo e funziona bene e passando alla funzione sopra può vedere tutti i valori tramite debug.

public CsvReport function return(){ 
    return new CsvReport 
       { 
        ShopName = this.val, 
        TargetVehicleName = val 
       }.ToList(); 
} 

classe che ho scritto per l'oggetto anonimo alto è come di seguito:

public class CsvReport 
    { 
     public string ShopName { get; set; } 
     public string TargetVehicleName { get; set; } 
    } 

quindi in questo caso la sua non funziona, sto selezionando primo record e ottenere proprietà come qui di seguito

this.Data.First().GetType().GetProperties(); 

Desidero utilizzare il primo modello anche qui, ovvero type(T).GetProperties

Quindi, qualsiasi soluzione per favore ........................

+1

vostro "il codice qui sotto" non ha molto senso, che lo rende un po 'difficile da commentare - e il vostro "oggetto anonimo" ... * non è anonimo *: è un 'CsvReport'. Puoi chiarire? Mostrare idealmente il codice in cui si chiama effettivamente "ExportToCsv'? Inoltre: come viene dichiarato 'this.Data'? –

+1

si prega di fornire un esempio più piccolo, quindi è più facile concentrarsi sul problema – lordkain

+0

Come stai istanziando il tuo 'ExportToCsv '? –

risposta

25

La riflessione su typeof(T) funziona correttamente; Ecco un esempio più semplice basato su sul tuo, ma (importante) eseguibile. Produce:

ShopName 
TargetVehicleName 

codice:

using System; 
using System.Collections.Generic; 
public class CsvReport 
{ 
    public string ShopName { get; set; } 
    public string TargetVehicleName { get; set; } 
} 
class ExportToCsv<T> 
{ 
    List<T> data; 
    public ExportToCsv(List<T> obj) 
    { 
     data = obj; 
    } 
    public void WritePropNames() 
    { 
     foreach (var prop in typeof(T).GetProperties()) 
     { 
      Console.WriteLine(prop.Name); 
     } 
    } 

} 
static class Program 
{ 
    static void Main() 
    { 
     var obj = new List<CsvReport>(); 
     obj.Add(new CsvReport { ShopName = "Foo", TargetVehicleName = "Bar" }); 
     new ExportToCsv<CsvReport>(obj).WritePropNames(); 
    } 
} 
+0

Sto facendo le stesse cose che hai fatto ma non ha funzionato per me restituisce "System.PropertyInfo [0]" invece di restituire le proprietà. – user2486535

+0

grazie, ho risolto il problema, mancava qualche tipo di inferenza nel mio codice, ecco perché non funzionava, anche io ho fatto le stesse cose che hai fatto, apprezzo molto il tuo interesse ad aiutarmi ........ – user2486535

Problemi correlati