2017-03-27 19 views
-6

List<Tag>のアイテムをObjectのプロパティに変換する方法を探しています。
たとえば、タグのnameの値が新しいオブジェクトのプロパティ名で、タグの値がvalueの値がオブジェクトのプロパティの値になるように、各タグを変換したいとします。C#リストをに変換するオブジェクトのプロパティ


List変換:Object中に、[{"name":"KS_1","value":123},{"name":"KS_2","value":"ABC"}]
を:{KS_1: 123, KS_2: "ABC"}

オブジェクトの名前と値が事前に定義されていません。
私は使用できません.Net 3.5を使用していますExpandoObject

+1

は、あなたはまだ何も試してみましたが、反射でこれを行うことができますか? – DavidG

+0

実行時間前に名前が分かっていますか?そうでなければ、['ExpandoObject'](https://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject(v = vs.110).aspx)を使うことができます。 – juharr

+1

どのようにそれらのプロパティにアクセスしますか? 「ExpandoObject」を見るか、[TypeBuilder](http://www.c-sharpcorner.com/UploadFile/87b416/dynamically-create-a-class-at-runtime/)でタイプを作成する必要があります。 –

答えて

1

問題は、次のようにLinqを使用して匿名タイプを使用することで解決できます。

var Result = new Object() 
{ 
    KS_1: List[0].value, 
    KS_2: List[1].value 
}; 

ただし、リストメンバーの可変リストが必要な場合は、反射を使用する必要があります。

+0

名前はあらかじめ定義されていません。 –

+0

名前がコンパイル時にわからない場合は、どのように値にアクセスするのですか。反射を介して? – Codor

1

1つのオプションは反射を使用することです。ここで仕事をして拡張メソッドです:

public T FromTags<T>(this List<Tag> tags) 
    where T : new() 
{ 
    var t = new T(); 

    var properties = typeof(T).GetProperties(); 

    foreach (var tag in tags) 
    { 
     var property = properties.SingleOrDefault(p => p.Name == tag.name); 

     if (property != null) 
     { 
      property.SetValue(t, tag.value); 
     } 
    } 

    return t; 
} 

そして、あなたはこのようにそれを呼び出します。

public class MyThing 
{ 
    public string SomeProperty { get; set; } 
    public string AnotherProperty { get; set; } 
} 

var myThing = tags.FromTags<MyThing>(); 
関連する問題