2012-09-12 2 views
2

ASP.NET MVC에서 ViewBag 속성은 동적 유형입니다.C#에서 동적 개체에 대한 할당이 어떻게 작동합니까?

Throught the codeViewBag의 다양한 "속성"에 할당됩니다

ViewBag.Message = "Hello world"; 
ViewBag.Title = "Page title"; 

이 작업을 수행하는 방법? docs을 읽으면서 나는 무엇이든지간에 ViewBag 그 자체를 얻을 수 있지만 왜 동적 유형 작업의 "멤버"에 무언가를 할당 할 수 있습니까? 여기

ViewBagpublic abstract class ControllerBase : IController 클래스에 정의 된 방법입니다 그냥 궁금

[Dynamic] 
public dynamic ViewBag { get; } 
// 
// Summary: 
//  Gets or sets the dictionary for view data. 
// 
// Returns: 
//  The dictionary for the view data. 
public ViewDataDictionary ViewData { get; set; } 

.

관련 질문 :Where can I find the official documentation for DynamicViewDataDictionary?

답변

4

ViewBagExpandoObject 또는 유사한 무언가이다. 이것은 기본적으로 "속성"이 키인 영광스러운 사전입니다.

UPDATE는 :
사실, 그것은 DynamicViewDataDictionary의 ASP.NET MVC 소스 코드 내부 클래스입니다. 이 클래스는 DynamicObject에서 상속되며 ViewBag 주위의 ViewData 속성이 ControllerBase 인 경우 ViewDataDictionary 주위의 래퍼입니다.
TryGetMemberTrySetMember에서 볼 수 있듯이 전화는 로직없이 ViewData에 위임됩니다.

+0

어떻게 알 수 있습니까? 'ViewBag' 속성의 정의를 보면'ExpandoObject'에 대한 참조를 볼 수 없습니까? 관련 질문으로 내 질문을 업데이트하겠습니다. – drozzy

+0

@drozzy Daniel이 링크 한 문서를 읽으면'expandoObject'를 인스턴스화하기 위해'dynamic sampleObject = new ExpandoObject();'를해야하고,'ViewBag'가 다음과 같이 선언 된 것처럼 보일 것입니다 :' 공개 동적 인 ViewBag {get; }'... – Paul

+0

@drozzy : 솔직히 말하면, 정확히 'ExpandoObject'라는 것을 모른다. 나는 또한'IDynamicMetaObjectProvider'를 구현하는 뭔가가 될 수 있다고 생각합니다. –

0

"형식은 정적 형식이지만 동적 형식의 개체는 정적 형식 검사를 우회합니다. 대부분의 경우 형식 개체처럼 작동합니다. 동적으로 입력 된 요소는 모든 작업을 지원하는 것으로 가정하므로 IronPython과 같은 동적 언어에서 COM API에서 개체가 값을 가져올 지 또는 HTML 문서 개체 모델 (DOM)에서 값을 가져올 지에 대해 염려 할 필요가 없습니다), 리플렉션 또는 프로그램의 다른 곳에서 가져 오지 만 코드가 유효하지 않으면 런타임에 오류가 발생합니다. "

http://msdn.microsoft.com/en-us/library/dd264736.aspx

관련 문제