2017-01-30 2 views
-2

Ich muss den Typ aller Mitglieder in einer Klasse abrufen.Abrufen von Typen aller Mitglieder einer Klasse

public class Order 
    { 
     public int OrderID { get; set; } 
     public int EmployeeID { get; set; } 
     public string CustomerID { get; set; } 
     public DateTime OrderDate { get; set; } 
     public bool Verified { get; set; } 

     public Order(int orderId, int empId, string custId, DateTime orderDate, bool verify) 
     { 
      this.OrderID = orderId; 
      this.EmployeeID = empId; 
      this.CustomerID = custId; 
      this.OrderDate = orderDate; 
      this.Verified = verify; 
     } 
    } 

und der Wert für die Klasse i durch Liste hinzugefügt haben

  List<dynamic> dy = new List<dynamic>(); 
      dy.Add(new { OrderID = 11, EmployeeID = 5, CustomerID = "ALFKI", OrderDate = new DateTime(2015,01, 10), Verified = true }); 
      dy.Add(new { OrderID = 12, EmployeeID = 4, CustomerID = "CDSAW", OrderDate = new DateTime(2015, 02, 12), Verified = true }); 
      dy.Add(new { OrderID = 13, EmployeeID = 6, CustomerID = "ASDFG", OrderDate = new DateTime(2015, 03, 13), Verified = true }); 
      dy.Add(new { OrderID = 14, EmployeeID = 3, CustomerID = "XSDAF", OrderDate = new DateTime(2015, 04, 14), Verified = false }); 
      dy.Add(new { OrderID = 15, EmployeeID = 2, CustomerID = "MNHSD", OrderDate = new DateTime(2015, 05, 15), Verified = true }); 
      dy.Add(new { OrderID = 16, EmployeeID = 1, CustomerID = "OKJHG", OrderDate = new DateTime(2015, 06, 16), Verified = false }); 
      return dy; 

Für die Felder Typen, habe ich versucht, mit dem folgenden Code.

Type type = dataSource.GetElementType(); 
Type t = typeof(object); 
t = type.GetProperty("OrderDate").PropertyType; 

Es löst einen Null Ausdruck Fehler.

Hier OrderDate ist DateTime-Objekt.

Type type = dataSource.GetType(); 

Diese Zeile gibt System.object zurück.

Wenn Sie versuchen, den Feldtyp OrderDate zu erhalten.

type.GetProperty(filterString).PropertyType; 

gibt Null zurück, um dieses Problem zu beheben.

Online: https://dotnetfiddle.net/zTYJGU

+0

Sie meinst du wie hier beschrieben? http://stackoverflow.com/questions/6536163/how-to-list-all-variables-of-class – Essigwurst

+8

Das sieht aus wie eine unangemessene Verwendung von 'dynamischen' ... –

+0

können Sie definieren, was' dataSource' ist? –

Antwort

0

Vor allem, wenn Sie alle Feld und Immobilienarten in bestimmten Typs bekommen Sie einige Dinge wissen sollten.

Jede Eigenschaft hat ein eigenes Hintergrundfeld. Für die automatisch generierte Eigenschaft public int MeProperty { get; set; } hat das Hintergrundfeld den Namen <MeProperty>k__BackingField.

Wenn Sie dies wissen, sollten Sie in Erwägung ziehen, FieldInfo anstelle von PropertyInfo zu extrahieren.

Eine andere Sache ist, dass Sie, dass GetProperty Methode gehen davon sogar versteckt Extrakt (private, protected etc ..) Mitglieder, die völlig falsch ist. Sie erwartet, dass Sie die Zugriffsebene angeben, indem Sie BindingFlags Enumeration verwenden.

Denn dieses Wissen immer extrahieren Sie können einfach alle Felder instad von Eigenschaften mit:

var fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); 

Danach Sie aufzuzählen und Feldtypen können:

var fieldTypes = fields.Select(f => f.FieldType); 

Jetzt Sie fieldTypes ist IEnumerable<Type> und enthält alle Feldtypen, die in type Feld angegeben sind.

Das eigentliche Problem ist, dass Sie Auto-Mapper implementieren möchten, die Ihren definierten Typ aus einem dynamischen Typ erstellt.Dazu würde ich Ihnen empfehlen, die Lösung von my answer on this question

EDIT zu verwenden:

Mit diesem Code: sollte

class Program 
{ 
    static void Main() 
    { 
     foreach(var field in typeof(Order).GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public)) 
     { 
      Console.WriteLine(field.Name); 
     } 
    } 

    public class Order 
    { 
     public int OrderID { get; set; } 
     public int EmployeeID { get; set; } 
     public string CustomerID { get; set; } 
     public DateTime OrderDate { get; set; } 
     public bool Verified { get; set; } 

     public Order(int orderId, int empId, string custId, DateTime orderDate, bool verify) 
     { 
      this.OrderID = orderId; 
      this.EmployeeID = empId; 
      this.CustomerID = custId; 
      this.OrderDate = orderDate; 
      this.Verified = verify; 
     } 
    } 
} 

Sie die gleiche Leistung haben wie:

<OrderID>k__BackingField                                                        
<EmployeeID>k__BackingField                                                        
<CustomerID>k__BackingField                                                        
<OrderDate>k__BackingField                                                        
<Verified>k__BackingField 
+0

Hi Rogalsi enthält, habe ich mit Ihrer Lösung ausprobiert. Aber ich bekomme nur drei Felder, nicht alle Felder – Kalai

Verwandte Themen