2012-10-24 4 views
1
object o = new { foo = 1 }; 

객체에 속성을 추가하는 다른 방법이 있습니까?객체 유형의 객체에 속성을 추가하십시오.

o["foo"] = 1o.foo = 1도 작동하지 않는 것 같습니다.

그리고 내가

var o = new { foo = 1 }; 

를 입력하면 왜 var에 "AnonomuysType"을하지 object의 유형은 무엇입니까?

답변

2

컴파일 된 유형에 속성을 추가 할 수 없습니다. 당신이 dynamic API를 사용하는 경우 속성로 을 작동 할 수있는 유일한 시간은 (물론, 종류-의), 그리고 개체가 예를 들어, 동적 속성을 지원 무언가이다 : 그러나

dynamic obj = new ExpandoObject(); 
obj.Foo = 123; 
obj.Bar = "abc"; 

, 이 값은 리플렉션을 통해 사용할 수 없습니다. 더 쉬운 접근법은 사전처럼 행동 할 수 있습니다 :

var obj = new Dictionary<string,object>(); 
obj["Foo"] = 123; 
obj["Bar"] = "abc"; 

사전 API를 통해 더 많은 정보를 찾을 수 있습니다. 당신이 할 : 당신의 마지막 질문 다시

new { foo = 1 }
var o = new { foo = 1 }; 

는 읽기 전용 특성과 발음하기 어려운 이름을 가진 일반 C# 클래스 인 익명 형식를 생성하는 컴파일러가. 이것은 object (결국 정규 class입니다.)이지만, var을 사용하면 컴파일러는 알려진 유형 (끔찍한 이름)을 사용하여 속성 (이 경우 .foo)에 액세스 할 수 있습니다.

+0

합니다. 'JavaScriptSerializer'는'dynamic' 타입의 객체를 직렬화하는 데 문제가 있습니까? – Johan

+0

@ 존 예, 그렇습니다; 사전은 더 좋을 것입니다 –

+0

좋습니다, 아주 좋은 설명을 해주셔서 감사합니다. – Johan

1

모두 개체은 익명 유형 (this question 참조)에서 상속됩니다. 다음을 볼 수 있습니다 :

object o = new { foo = 1 }; 
if (o is object) 
    Console.Write("Yes, i'm an object!"); 
else 
    Console.Write("no, no, i'm not an object!"); 

속성을 만들 때만 익명 형식에 속성을 추가 할 수 없습니다.

당신은 Dictionary<string, object> 대신 사용할 수 있습니다

var o = new Dictionary<string, object>(); 
o.Add("Foo", 123); 
o.Add("Bar", "abc"); 

지금이 방법으로 액세스 할 수 있습니다 : 내가 볼

object bar = o["Bar"]; // "abc" 
관련 문제