2017-03-27 186 views
-6

我正在尋找一種方法將List<Tag>項目轉換爲Object屬性。
例如,我想要轉換每個標記,以便標記的name的值是一個新的對象屬性名稱,標記的value的值是對象屬性的值。C#轉換列表<T>轉換爲對象屬性

例如
轉換List[{"name":"KS_1","value":123},{"name":"KS_2","value":"ABC"}]
進入Object{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

一種選擇是使用反射。下面是做這項工作的擴展方法:

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