2017-03-27 3 views
-6

항목을 Object 속성으로 변환하는 방법을 찾고 있습니다.
예를 들어, 태그의 name 값이 새 개체 속성 이름이고 태그 값 value이 개체 속성 값이되도록 각 태그를 변환하고 싶습니다.C# 목록을 개체 속성으로 변환

예컨대
변환 List : [{"name":"KS_1","value":123},{"name":"KS_2","value":"ABC"}]
Object 속으로는 : {KS_1: 123, KS_2: "ABC"}

개체의 이름과 값이 미리 정의되어 있지 않습니다.
사용할 수 없습니다. 닷넷 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>();