ExpandoObject의 진정한 이점은 무엇입니까?
에 추가되는 ExpandoObject 클래스입니다.NET 4를 사용하면 런타임에 개체에 대한 속성을 임의로 설정할 수 있습니다.
해시 테이블을 사용하는 것보다 이점이 있습니까?제가 아는 한, 이것은 해시 테이블에 불과하며 조금 더 간결한 구문으로 액세스할 수 있습니다.
예를 들어, 다음과 같은 이유가 있습니다.
dynamic obj = new ExpandoObject();
obj.MyInt = 3;
obj.MyString = "Foo";
Console.WriteLine(obj.MyString);
다음보다 훨씬 낫거나 실질적으로 다릅니다.
var obj = new Dictionary<string, object>();
obj["MyInt"] = 3;
obj["MyString"] = "Foo";
Console.WriteLine(obj["MyString"]);
런타임에 결정되는 유형을 사용하는 것이 확실하지 않은 것 외에 임의 사전 유형을 사용하는 대신 ExpandoObject를 사용하면 어떤 실질적인 이점을 얻을 수 있습니다.
당신이 언급한 MSDN 기사를 썼기 때문에, 저는 이것에 대해 답변해야 할 것 같습니다.
먼저, 저는 이 질문을 예상했고 그래서 ExpandoObject의 실제 사용 사례를 보여주는 블로그 게시물을 작성했습니다.Dynamic in C# 4.0: Expando Object 소개.
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는 INOTIFY를 구현합니다.사전보다 속성을 더 많이 제어할 수 있는 PropertyChanged 인터페이스입니다.
마지막으로 다음과 같이 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>
핸들러의 두가 그로인핸두번의주째은장러들해주▁은▁of▁be▁which▁cause장▁would▁thedynamic
.
한 가지 장점은 바인딩 시나리오에 있습니다.데이터 그리드 및 속성 그리드는 Type Descriptor 시스템을 통해 동적 속성을 선택합니다.또한 WPF 데이터 바인딩은 동적 속성을 이해하므로 WPF 컨트롤은 사전보다 쉽게 ExpandoObject에 바인딩할 수 있습니다.
사전 항목이 아닌 DLR 속성을 예상하는 동적 언어와의 상호 운용성도 일부 시나리오에서 고려할 수 있습니다.
저에게 진정한 이점은 XAML의 데이터 바인딩이 매우 간편하다는 것입니다.
public dynamic SomeData { get; set; }
...
SomeData.WhatEver = "Yo Man!";
...
<TextBlock Text="{Binding SomeData.WhatEver}" />
기반으로 구축된 다른 언어와의 상호 운용DLR
제가 생각할 수 있는 첫 번째 이유입니다.당신은 그들을 통과시킬 수 없습니다.Dictionary<string, object>
그것이 아니기 때문에IDynamicMetaObjectProvider
추가된 또 다른 이점은 다음과 같은 이점을 구현한다는 것입니다.INotifyPropertyChanged
즉, WPF의 데이터 바인딩 세계에서 그것은 또한 무엇 이상의 이점을 가지고 있습니다.Dictionary<K,V>
제공할 수 있습니다.
이것은 모두 프로그래머의 편리함에 관한 것입니다.저는 이 물건으로 빠르고 더러운 프로그램을 쓰는 것을 상상할 수 있습니다.
사전을 사용하여 동적으로 추가된 속성을 더 이상 "가짜"하지 않기 때문에 구문적인 이점이 있을 것이라고 생각합니다.
그리고 역동적인 언어들과 교류할 수 있을 것입니다.
들어오는 구조화된 데이터(예: XML, Json)에 대한 동적 애드혹 유형을 만들기 위해 ExpandoObject를 사용하는 것에 대한 MSDN 문서의 예입니다.
ExpandoObject의 동적 속성에 대리자를 할당할 수도 있습니다.
dynamic person = new ExpandoObject();
person.FirstName = "Dino";
person.LastName = "Esposito";
person.GetFullName = (Func<String>)(() => {
return String.Format("{0}, {1}",
person.LastName, person.FirstName);
});
var name = person.GetFullName();
Console.WriteLine(name);
따라서 런타임에 동적 객체에 일부 논리를 주입할 수 있습니다.따라서 람다 표현식, 폐쇄식, 동적 키워드 및 동적 객체 클래스와 함께 자바스크립트 또는 PHP와 같은 동적 언어에서 알고 있는 C# 코드에 일부 기능 프로그래밍 요소를 도입할 수 있습니다.
이것이 편리한 경우도 있습니다.예를 들어 모듈화된 셸에 사용할 것입니다.각 모듈은 설정에 바인딩된 자체 구성 대화상자 데이터를 정의합니다.데이터 컨텍스트인 ExpandoObject를 제공하고 값을 구성 저장소에 저장합니다.이렇게 하면 구성 대화 상자 작성기가 값에 바인딩되기만 하면 값이 자동으로 생성되고 저장됩니다. (물론 이러한 설정을 사용하기 위해 모듈에 제공됩니다.)
사전보다 쉽게 사용할 수 있습니다.그러나 모든 사람들은 내부적으로 그것이 단지 사전일 뿐이라는 것을 알아야 합니다.
LINQ는 단지 통사적인 설탕과 비슷하지만, 때때로 그것은 그것을 더 쉽게 만듭니다.
질문에 직접 답하려면 다음과 같이 하십시오.그것은 쓰기도 쉽고 읽기도 쉽습니다. 말하면 으로 하만엄말그본로으질적것은하면지밀히▁a▁but로본으▁essential질적.Dictionary<string,object>
(값을 하나로 캐스팅하여 값을 나열할 수도 있습니다.)
var obj = new Dictionary<string, object>;
...
Console.WriteLine(obj["MyString"]);
모든 것에 ToString()이 있기 때문에 가능하다고 생각합니다. 그렇지 않으면 원래 유형을 알고 해당 유형에 '객체'를 캐스팅해야 합니다.
이것들 중 일부는 다른 것들보다 더 자주 유용합니다, 저는 철저하게 하려고 노력하고 있습니다.
보다 직접적인 도트 표기법을 사용하여 컬렉션(이 경우에는 효과적으로 "사전")에 액세스하는 것이 훨씬 더 자연스러울 수 있습니다.
이것은 정말 멋진 튜플로 사용될 수 있을 것 같습니다.회원을 "아이템1", "아이템2" 등으로 부를 수 있습니다.하지만 이제는 그럴 필요가 없습니다. 투플과 달리 변형이 가능합니다.이것은 지능적 지원이 부족하다는 큰 단점을 가지고 있습니다.
사전의 느낌처럼 "구성원 이름을 문자열로 사용"하는 것이 불편할 수 있으며, 코드가 구성원을 사용하는 방법을 이해하려고 할 때 이름 지정 규칙이 코드화되고 형태소와 음절을 다루는 것으로 이어질 수 있습니다. :-P
ExpandoObject 자체에 값을 할당할 수 있습니까, 아니면 멤버에만 값을 할당할 수 있습니까?다이내믹/다이내믹[]과 비교하고 대조합니다. 필요에 가장 적합한 것을 사용하십시오.
각 루프에 대해 동적/동적[]이(가) 작동하지 않는다고 생각합니다. var를 사용해야 하지만 ExpandoObject를 사용할 수도 있습니다.
클래스에서 동적을 데이터 멤버로 사용할 수 없습니다. 적어도 키워드와 비슷하기 때문에 ExpandoObject를 사용할 수 있기를 바랍니다.
나는 그것이 "ExpandoObject"이며, 동적인 것이 많이 사용되는 유형에 따라 구별되는 코드를 사용하여 매우 일반적인 것을 구분하는 데 유용할 것이라고 예상합니다.
한 번에 여러 레벨을 드릴다운할 수 있으면 좋겠습니다.
var e = new ExpandoObject();
e.position.x = 5;
etc...
그것은 가능한 최고의 예가 아닙니다. 자신의 프로젝트에서 적절한 우아한 사용법을 상상해 보십시오.
이 중 일부를 코드 빌드하여 결과를 지능화할 수 없다는 것은 유감스러운 일입니다.이게 어떻게 될지는 잘 모르겠습니다.
그들이 회원뿐만 아니라 가치도 가질 수 있다면 친절하세요.
var fifteen = new ExpandoObject();
fifteen = 15;
fifteen.tens = 1;
fifteen.units = 5;
fifteen.ToString() = "fifteen";
etc...
valueTupples 다음에 ExpandoObject 클래스는 어떤 용도로 사용됩니까?ExpandoObject를 사용하는 6줄 코드:
dynamic T = new ExpandoObject();
T.x = 1;
T.y = 2;
T.z = new ExpandoObject();
T.z.a = 3;
T.b= 4;
튜플로 한 줄로 쓸 수 있습니다.
var T = (x: 1, y: 2, z: (a: 3, b: 4));
튜플 구문 외에도 강력한 유형 추론과 지능형 지원이 있습니다.
언급URL : https://stackoverflow.com/questions/1653046/what-are-the-true-benefits-of-expandoobject
'programing' 카테고리의 다른 글
Angular - ng: 명령을 찾을 수 없습니다. (0) | 2023.05.05 |
---|---|
복수의 값을 한 번에 포스트그레스 테이블에 삽입하려면 어떻게 해야 합니까? (0) | 2023.05.05 |
이클립스에서 동적 웹 프로젝트의 컨텍스트 루트를 변경하는 방법은 무엇입니까? (0) | 2023.05.05 |
하위 디렉터리를 제외한 모든 것을 무시하도록 Git에게 어떻게 말합니까? (0) | 2023.05.05 |
3.x를 사용하여 람다 매개 변수에 대한 2.x의 튜플 언팩을 시뮬레이션하려면 어떻게 해야 합니까? (0) | 2023.05.05 |