2014-10-17 2 views
1

다음 작업을 수행하려고합니다.익명 개체로 사전 초기화

private static Dictionary<int, object> MAPS = new Dictionary<int, object> 
{ 
    {1, new {1, 2, 3}} 
}; 

그것은 내가 MSDN에 따라 예상대로 작동하지 않습니다, 그래서 문제가 내가 익명 객체를 사용하고 있다는 것을 꽤 확신합니다. 내 물건에 대한 새로운 유형을 만들고 싶지 않고 모든 사전을 동일한 사전에 보관하고 싶다고 가정하면 어떻게해야합니까?

나는 this answer을 보았지만 지금은 약간 날짜가 있기 때문에 프레임 워크에 새로운 것이 있다는 것을 기대하고 있습니다.

+1

_ "예상대로 작동하지 않습니다."_ 실제 컴파일러 오류를 표시하면 도움이 될 것입니다. _ "잘못된 익명 형식 멤버 선언자입니다. 익명 형식 멤버는 다음과 같이 선언해야합니다. 회원 할당, 단순한 이름 또는 회원 액세스 "_. – CodeCaster

+0

@CodeCaster Point 찍은. 나는 그것이 무엇인가 기본적인 것이라고 생각했고 방금 뇌의 문제가 있다고 생각했습니다. 하지만 당신 말이 맞습니다. :) –

답변

3

int의 배열을 값으로 사용하려는 경우이 방법을 사용하십시오.

private static Dictionary<int, object> MAPS = new Dictionary<int, object> 
{ 
    {1, new[] {1, 2, 3}} 
}; 

또는이 익명 클래스

private static Dictionary<int, object> MAPS = new Dictionary<int, object> 
{ 
    {1, new { a = 1, b = 2, c = 3}} 
}; 

또는 더 나은 아직 object를 사용하지 않는를 원하는 경우. int 콜렉션에 int[] 또는 List<int>을 사용하거나 특정 값이 필요한 경우 클래스 또는 구조체를 선언하십시오. 각 값에 대해 3 int이 필요하면 Tuple<int,int,int>을 사용해도됩니다. 그러나 일반적으로 object에서 캐스팅 할 필요성을 피하려고 시도해야합니다.

+0

아, 나는 **에 ** 새 연산자 **와 ** 각도의 객체 유형에 대괄호를 설정하려했습니다. 그리고 나는 평등 부호 대신에 콜론을 사용했다. 어리석은 JSON 날을 손상 ... :) +1 –

+0

* a * 입력 할 수 있습니까? * b *와 * c * 클래스를 선언하지 않고? –

+0

그들은 암시 적으로 당신이 설정 한 타입을 취할 것이므로, 필요하다면 당신은 그 값을 캐스팅 할 수 있습니다. 그러나 익명의 클래스에서 주된 문제는 사전에서 값을 가져올 때 캐스팅 할 수 없다는 것입니다. 당신은'object' 대신에'dynamic'을 사용하려고합니다. – juharr

1

new {1, 2, 3}의 구문은 not a collection initializer nor an anonymous object initializer입니다. 어떤 유형의 객체를 만들고 싶습니까?

익명 객체에 new { elements = new[] { 1, 2, 3 } }과 같은 것을 사용하면 정수가 들어있는 elements 속성을 사용할 수 있습니다.

또는 개별 속성 이름을 new { foo = 1, bar = 2, baz = 3 }으로 지정할 수 있습니다.

+0

주어진 정수에 대해 두 개의 다른 정수를 제공하는 사전을 갖고 싶습니다. –

1

익명의 유형 특성 그냥 유형입니다, 당신의 anonymus 유형은 속성이 없습니다 :

private static Dictionary<int, object> MAPS = new Dictionary<int, object> 
{ 
    {1, new { Prop1 = 1, Prop2 = 2, Prop3 = 3}} 
}; 

하지만 어떻게 당신이, 익명 형식으로 개체에서 캐스팅 할 수 있습니까?

: 좋은 질문이 있습니다. MAPS [1] [0]을 캐스팅해야합니까? 아니면 거기에 암시 적으로 형식을 강제 적용 할 수있는 방법이 있습니까?

당신이 확장 메서드처럼 해킹하지 않고 익명 형식에 개체를 캐스팅 할 수

:

var prototype = new { Prop1 = 0, Prop2 = 0, Prop3 = 0 }; 

이제이 작품 :

public static T CastByPrototype<T>(this object obj, T prototype) 
{ 
    return (T)obj; 
} 

그것은 같은 프로토 타입 익명 형식을 사용합니다

var value = MAPS[1].CastByPrototype(prototype); // you can use value.Prop1 

프로토 타입이 InvalidCastException 인 경우 실패합니다. ype는 (동일한 순서로) 동일한 속성을 가지고 있지 않습니다.

+1

Hehe, @juharr가 당신을 때렸다. 느린 손가락 하루? ;) –

+0

좋은 질문이 있습니다. * MAPS [1] [0] *을 캐스팅해야합니까? 아니면 암시 적으로 거기에 유형을 강제로 넣을 수 있습니까? –

+0

@KonradViltersten 만약 당신이'MAPS [1] [0]'으로 값을 얻고 싶다면'Dictionary '또는'Dictionary >'으로 바꾸는 것이 어떻겠습니까? – juharr

1

@TimSchmelter 및 @juharr의 답변 이외에도 이름을 통해 속성을 참조 할 수 있지만 클래스를 만들지 않으려면 dynamic을 사용할 수 있습니다 (분명히 얻을 수는 없지만 이 사용이 제한됩니다, 그래서 어떤 인텔리) :

Dictionary<int, object> MAPS = new Dictionary<int, object> 
{ 
    {1, new { a = 1, b = 2, c = 3} as dynamic} 
}; 

Console.WriteLine(((dynamic)MAPS[1]).b); //prints 2 

또는 당신이 DictionaryDictionary<int, dynamic>를 만든 경우 좀 더 쉽게 생활하게 캐스트 포기할 수 : 날기에

Dictionary<int, dynamic> MAPS = new Dictionary<int, object> 
{ 
    {1, new { a = 1, b = 2, c = 3}} 
}; 

Console.WriteLine(MAPS[1].b); //prints 2 

유일한 혜택을 g object 또는 dynamic은 다른 유형의 콜렉션을 저장할 수 있다는 것입니다. int만을 저장하는 경우 List<int> 또는 int[]을 사용하는 것이 가장 좋습니다.

관련 문제