2013-08-08 7 views
13

Ich habe eine generische Klasse, in der ich eine Funktion habe, Eigenschaften des generischen Objekts zu erhalten. Es ist wie folgt.erhalten Eigenschaften mit Reflexionen für generische Art Objekt

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

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

Es funktioniert gut und gibt mir Eigenschaften, wenn ich das Objekt durch die Auswahl von einem Objekt (Klasse) wie unten

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

und gebe dieses Ergebnis als result.ToList();

aber wenn ich versuche passieren Um mein eigenes anonymes Objekt zu erstellen, indem ich eine Klasse für die Eigenschaften wie unten erstelle, funktioniert es nicht keine Eigenschaften zurückgegeben

Hinweis: Der unten stehende Code wird in einer Schleife aufgerufen, und wenn er gut funktioniert und an die obige Funktion übergeben wird, können alle Werte durch Debugging angezeigt werden.

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

Klasse, die ich für das oben anonyme Objekt geschrieben habe, ist wie folgt:

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

so in diesem Fall seiner nicht funktioniert, ich ersten Datensatz bin die Auswahl und bekommt Eigenschaften wie unter

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

Ich möchte das erste Muster auch hier verwenden, das ist type(T).GetProperties

Also, alle Arbeiten bitte ........................

+1

Ihre „die folgenden Code“ nicht viel Sinn machen, die es ein bisschen schwer zu kommentieren macht - und Ihr „anonymes Objekt“ ... * ist nicht anonym *: es ist ein 'CsvReport'. Könntest Du das erläutern? Zeigen Sie im Idealfall den Code, an dem Sie 'ExportToCsv' nennen? Außerdem: Wie wird 'this.Data' deklariert? –

+1

Bitte geben Sie kleinere Beispiel, dann ist es einfacher, auf das Problem zu konzentrieren – lordkain

+0

Wie Instanziieren Sie Ihre 'ExportToCsv '? –

Antwort

25

Reflexion auf typeof(T) funktioniert gut; Hier ist ein einfacheres Beispiel basierend auf auf Ihrem, aber (wichtig) runnable. Es gibt:

ShopName 
TargetVehicleName 

Code:

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

Ich mache das gleiche, was du getan hast, aber es hat nicht funktioniert, es gibt "System.PropertyInfo [0]" zurück, anstatt Eigenschaften zurückzugeben. – user2486535

+0

danke ich reparierte das Problem dort irgendeine Art Schlussfolgerung, die in meinem Code fehlt, deshalb funktionierte es nicht, sogar ich tat das gleiche Material, wie Sie taten, ich schätze wirklich Ihr Interesse, mir zu helfen ........ – user2486535

Verwandte Themen