언급 한 MSDN 기사를 작성 했으므로이 기사에 대답해야한다고 생각합니다.
먼저이 질문을 예상했기 때문에 ExpandoObject : Dynamic in C # 4.0 : ExpandoObject 소개에 대한 실제 사용 사례를 보여주는 블로그 게시물을 작성했습니다 .
곧 ExpandoObject를 사용하면 복잡한 계층 적 개체를 만들 수 있습니다. 예를 들어, 사전 내에 사전이 있다고 가정하십시오.
Dictionary<String, object> dict = new Dictionary<string, object>();
Dictionary<String, object> address = new Dictionary<string,object>();
dict["Address"] = address;
address["State"] = "WA";
Console.WriteLine(((Dictionary<string,object>)dict["Address"])["State"]);
계층이 깊을수록, 추악한 것이 코드입니다. ExpandoObject를 사용하면 우아하고 읽을 수 있습니다.
dynamic expando = new ExpandoObject();
expando.Address = new ExpandoObject();
expando.Address.State = "WA";
Console.WriteLine(expando.Address.State);
둘째, 이미 지적했듯이 ExpandoObject는 INotifyPropertyChanged 인터페이스를 구현하여 사전보다 속성을 더 많이 제어 할 수 있습니다.
마지막으로 다음과 같이 ExpandoObject에 이벤트를 추가 할 수 있습니다.
class Program
{
static void Main(string[] args)
{
dynamic d = new ExpandoObject();
// Initialize the event to null (meaning no handlers)
d.MyEvent = null;
// Add some handlers
d.MyEvent += new EventHandler(OnMyEvent);
d.MyEvent += new EventHandler(OnMyEvent2);
// Fire the event
EventHandler e = d.MyEvent;
e?.Invoke(d, new EventArgs());
}
static void OnMyEvent(object sender, EventArgs e)
{
Console.WriteLine("OnMyEvent fired by: {0}", sender);
}
static void OnMyEvent2(object sender, EventArgs e)
{
Console.WriteLine("OnMyEvent2 fired by: {0}", sender);
}
}
또한 동적으로 이벤트 인수를 허용하는 데 방해가되는 것은 없습니다. 즉,을 사용하는 대신 핸들러의 두 번째 인수를 EventHandler
사용 EventHandler<dynamic>
하는을 사용할 수 있습니다 dynamic
.