2017-04-14 14 views
-1

목록에서 expandoObject를 초기화하고 싶습니다.목록에서 expandoobject를 초기화하십시오. <T>

internal class CarKeyValue { 
    public CarKey CarKey { get; set; } 
    public string Value1 { get; set; } 
    public string Value2 { get; set; } 
} 

public enum CarKey { 
    Brand = 1, 
    Model = 2, 
    Year = 3, 
    FactoryLocation = 4, 
    //more than 400 key here... 
} 

var car = new List<CarKeyValue>{ 
    new CarKeyValue {CarKey = CarKey.Brand, Value1 = "Ford"}, 
    new CarKeyValue {CarKey = CarKey.Model, Value1 = "Focus",Value2 = "Titanium"}, 
    new CarKeyValue {CarKey = CarKey.Year, Value1 = "1995"}, 
    new CarKeyValue {CarKey = CarKey.FactoryLocation, Value1 = "Turkey",Value2="Bursa"}, 
     }; 

dynamic expando = new ExpandoObject(); 
foreach(var item in car){ 
    expando.[item.CarKey].Value1 = item.Value1; 
//Incorrect primary expression. 
    expando.[item.CarKey].Value2 = item.Value2; 
} 

어떻게하면됩니까? 나는 Expando Object를 사용할 필요가있다. 나는 IDictionary<string,dynamic>을 사용하려고 시도하지만 또 다른 예외가 발생했습니다.

가능한 방법이 있습니까?

답변

0

내 솔루션이 여기에 있습니다. IDictionary를 사용합니다. Foo() 또는 다른 것을 사용하여 필요한 것은 아닙니다. 이 코드 블록은 잘 작동합니다.

IDictionary<string,dynamic> expando = new ExpandoObject(); 
foreach(var item in car) { 
    expando.Add(item.CarKey.ToString(),null); 
    expando[item.CarKey.ToString()] = new { Value1 = item.Value1,Value2 = item.Value2 }; 
} 
+0

그것이 내가 당신에게 말한 것입니다. 익명 클래스를 사용하든 사용하지 않든간에 열거 형을 키로 사용할 수 없으며 먼저 인스턴스화해야합니다. –

+0

알았어, 열거 형을 사용하지 못하지만 다른 것들을 집중 시켰는데, 나는 해결책이 필요하다는 것을 알았다. 나는 당신의 방식을 잘못 사용할 수도 있지만 그것은 나를 위해 일하지 않습니다. 작동하는 .net 바이올린 예제가 있다면 그것을보고 싶습니다. –

0

예, 가능하지만 의미가 없습니다. expando 객체를 IDictionary<string, object> 또는 IDictionary<string, dynamic>으로 전송해야합니다. 당신이 expando[item.CarKey.ToString()]에 값을 할당하지 않기 때문에

IDictionary<string, object> expando = new ExpandoObject(); 
foreach (var item in car) 
{ 
    expando[item.CarKey.ToString()].Value1 = item.Value1; 
} 

위의 코드

가 실패합니다. 대신 존재하지 않는 객체에서 속성을 설정하려고합니다. 일반 코드는 여기에 NullReferenceException을 던졌을 것입니다. 당신이 뭔가의 인스턴스에 객체를 설정 그래서 일단 당신이 그것을 사용할 수

을 (SomePropertynull 어디 있는지., expando.SomeProperty.Value1로 위의 코드를 읽을 수 있습니다)하지만 다음 ExpandoObject 하나를 사용하여 훨씬 사용이 없다 기타 :

Foo foo = new Foo(); 
expando[item.CarKey.ToString()] = foo; 
foo.Value1 = item.Value1; 
+0

답장을 보내 주시면 다시 시도해 보지만 실패합니다. 참고 : 내 질문에 대해 유감입니다. 나는 'expando [item.CarKey] .Value1 = item.Value1;'이라고 썼다. 나는 나의 질문을 편집했다. True 코드는 'expando. [item.CarKey] .Value1 = item.Value1;'입니다. –

+0

당신은 제 대답으로 아무 것도하지 않았습니다. –

+0

아니요 Foo()와 시도하지 않았습니다. 'expando [item.CarKey.ToString()] = foo;'예외가 발생했습니다. 추가 정보 : 'System.Dynamic.ExpandoObject'형식의 표현식에 []을 (를)를 적용 할 수 없습니다. –