2016-06-20 8 views
1

Mein Ziel ist es, den Code zu reduzieren und zu vermeiden, dass Bedingungen hinzugefügt werden, wenn meine Liste von Objekten länger wird, kann es mehr als 100 Felder im Laufe des Projekts . Ich habe ein Objekt vom Typ MyObjectKopieren von Daten aus einer Objektliste in ein anderes Objekt in C#

public class MyObject 
{ 
    public string fininstId { get; set; } 
    public string paymentMethod { get; set; } 
    public string cardNumber { get; set; } 
    public string cardExpiry { get; set; } 
    public string cardCVC { get; set; } 
    public string AcctName { get; set; } 
    public string Password { get; set; } 
    public string mode { get; set; } 
} 

ein anderer Typ Antwort

public class Response 
{ 
    public Response(); 

    public string Title { get; set; } 
    public string Value { get; set; } 
} 

und ich brauche alle in Datalist unten enthaltenen Daten zu MyObject kopiert werden, wohl wissend, dass die Der Name der Felder wird in MyObject und DataList identisch sein.

List<Response> dataList = new List<Response>(); 

/*...populating dataList here ...*/ 

MyObject request = new MyObject(); 

foreach (var item in dataList) 
{ 
    switch (item.Title) 
    { 
     case "cardNumber": 
      request.cardNumber = item.Value; 
      break; 
     case "cardExpiry": 
      request.cardExpiry = item.Value; 
      break; 
     case "cardCVC": 
      request.cardCVC = item.Value; 
      break; 
     case "fininstId": 
      request.fininstId = item.Value; 
      break; 
     case "paymentMethod": 
      request.paymentMethod = item.Value; 
      break; 
     case "AcctName": 
      request.AcctName = item.Value; 
      break; 
     case "Password": 
      request.Password = item.Value; 
      break; 
    } 
} 

Gibt es es sowieso dynamisch gemacht werden?

+0

Sie Reflexion können die Menge an Code, um etwas zu reduzieren, dass nur stimmt die Title-Zeichenfolge mit einem Eigenschaftsnamen überein, aber es wird auch nicht annähernd funktionieren. –

+0

Sie können [reflection verwenden, um eine Eigenschaft zu finden, die mit der Zeichenfolge in 'Title' übereinstimmt (http://stackoverflow.com/questions/7718792). Die Bedingungen, die Sie berücksichtigen müssen, sind: "Was ist, wenn die Eigenschaft nicht existiert?" und "Wie gehe ich mit der Typkonvertierung um?". Keiner von denen hat eine triviale Antwort. –

Antwort

3

Sie können reflection und InvokeMember Methode

Zum Beispiel verwenden:

Response item = new Response(); 
item.Title = "Password"; 
item.Value = "value"; 

MyObject request = new MyObject(); 
request.GetType().InvokeMember(item.Title, 
BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetProperty, 
Type.DefaultBinder, request, new[] {item.Value}); 

Oder mit GetProperty & SetValue

var property = typeof(MyObject).GetProperty(item.Title); 
property.SetValue(request, item.Value, null); 
Verwandte Themen