2017-03-22 19 views
-1

私は応答List<List<KeyValuePair<string, object>>>を持っていますが、応答をList<ClassName>に変換したいと思います。
KeyValuePairキーとClassNameプロパティは、両方の応答を変換するための最もプログラム的な方法は何ですか同じ名前と同じ型List <KeyValuePair <string、object >>をクラスに変換する方法.Net Coreのモデル

ですか?

私は応答

私のクラス構造

public class TestModel 
{ 
    public string TaxablePersonCode { get; set; } 
    public string LegalNameAsPerPan { get; set; } 
    public string TradeName { get; set; } 
    public string ConstitutionName { get; set; } 
    public string ResidentialStatusName { get; set; } 
    public string PrimaryMobileNo { get; set; } 
    public string FlatOrOfficeNo { get; set; } 
    public string TownOrCityOrDist { get; set; } 
    public string Pincode { get; set; } 
    public string StateName { get; set; } 
    public string CountryName { get; set; } 
    public string ContactName { get; set; } 
    public string ContactDesignationName { get; set; } 
    public string ContactMobile { get; set; } 
    public string ContactEmail { get; set; } 
} 

var listKeyValue = response.Select(x => x.Value).ToList(); 
var data = JsonConvert.DeserializeObject<List<TestModel>>(listKeyValue); 

答えて

0

について不明な点がこのIMの一部のみがインデックス化されて持っています正しいプロパティの最終リストですが、あなたにとって最適なものを選択することができます。 .Where()を毎回使用することで、正しい結果が得られることが保証されますが、毎回リストを検索してより遅くなります。あなたの%100がリストの順番が決して変わらないなら、[]または.ElementAt()を使って、あなたが望む要素のためにリストを直接索引付けすることによっていくらかのパフォーマンスを得ることができます。とにかく、あなたの探しているものをheres。

List<TestModel> myList = response.Select(x => new TestModel 
{ 
    // Using Where 
    TaxablePersonCode = x.Where(t => t.Key == "TaxablePersonCode").First().Value, 
    // Using direct index 
    LegalNameAsPerPan = x[1].Value, 
    // Using ElementAt 
    TradeName = x.ElementAt(2).Value, 
    ... 
}); 

希望します。

0

JsonConvertクラスで何か結果がありましたか?それはあなたのために働いたのですか?そうでない場合(JSONとフィールドが正しく命名されている場合)、あなたはこのような何かを試すことができます。

var listKeyValue = response.Select(x => x.Value).ToList(); 

var result = new List<TestModel>(); 
foreach (var keyValueList in listKeyValue) 
{ 
    // convert the response list of KeyValuePair to dictionary 
    var dictionary = keyValueList.ToDictionary(kv => kv.Key, kv => kv.Value); 

    var tempModel = new TestModel(); 

    // get actual value by name of the rpoperty 
    tempModel.TaxablePersonCode = dictionary[nameof(tempModel.TaxablePersonCode)].ToString(); 
    // etc. 
    result.Add(tempModel); 
} 

はたぶん、このアプローチは、反射を改善することができたが、これはパフォーマンスが低下します。それ以外の場合は

List<TestModel> models = JsonConvert.DeserializeObject<List<TestModel>>(response); 

、あなたがバインドするためにリフレクションを使用することができます。私はあなたがJSONを使用しているので、あなたはおそらくちょうど私がこのような何かを見て期待され、適切にオブジェクトをデシリアライズする必要があります参照

// get all properties to populate 
var properties = typeof(TestModel).GetProperties(BindingFlags.Public | BindingFlags.Instance); 
0

オブジェクトのプロパティへの既知のKeyValuePairキー。つまり、戻り値が返されたデータの値と互換性があることを確認する必要があります。そうでない場合は失敗します。

outerList.ForEach(innerList => { 
    TestModel result = new TestModel(); 
    innerList.ForEach(listItem => { 
     result 
      .GetType() 
      .GetProperty(listItem.Key) 
      ?.SetValue(result, listItem.Value); 
    }); 
}); 
関連する問題