2016-06-20 8 views
1

私の目標は、コードを減らし、渡されたオブジェクトのリストが長くなるときに条件を追加することを避けることです。プロジェクトが進むにつれて最大100+フィールドになる。私は型のオブジェクトMyObjectに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; } 
} 

public class Response 
{ 
    public Response(); 

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

タイプレスポンスの別のものを持っていると私はことを知って、 MyObjectににコピーする DataListコントロール下にに含まれるすべてのデータを必要としますフィールド名は MyObjectdataListの両方で同じになります。

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; 
    } 
} 

とにかく動的に行うことはできますか?

+0

を使用してタイトル文字列をプロパティ名と照合しますが、近くでは実行されません。 –

+0

[reflectionを使って 'Title'の文字列と一致するプロパティを見つけることができます(http://stackoverflow.com/questions/7718792)。あなたが考慮する必要がある条件は、「プロパティが存在しない場合はどうですか?」 「どのように型変換を処理するのですか?」それらのどちらも些細な答えはありません。 –

答えて

3

あなたが例えばreflectionInvokeMember方法

を使用することができます。

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}); 

か、そのちょうど何かにコードの量を減らすためにリフレクションを使用することができますGetProperty & SetValue

var property = typeof(MyObject).GetProperty(item.Title); 
property.SetValue(request, item.Value, null); 
関連する問題