C# 팁: ExpandoObject를 IDictionary로 변환

5596 단어 csharpdotnet
C#에서 ExpandoObjects는 사전 정의된 모양 없이 동적으로 채워진 개체입니다.

dynamic myObj = new ExpandoObject();
myObj.Name ="Davide";
myObj.Age = 30;

NameAgeExpandoObject 정의의 일부가 아닙니다. 유형을 선언하지 않고 추가한 두 개의 필드입니다.

이것은 동적 개체이므로 원하는 대로 새 필드를 추가할 수 있습니다. 내 도시를 추가해야 한다고 가정해 보겠습니다. 간단히 사용할 수 있습니다.

myObj.City = "Turin";

ExpandoObject 클래스에 필드를 만들지 않고.

지금: 어떻게 모든 값을 검색할 수 있습니까? 아마도 가장 좋은 방법은 ExpandoObjectDictionary 로 변환하는 것입니다.

새 사전 만들기


IDictionary를 사용하면 객체의 키에 쉽게 액세스할 수 있습니다.

변경되지 않는 ExpandoObject가 있는 경우 이를 사용하여 새 IDictionary를 만들 수 있습니다.

dynamic myObj = new ExpandoObject();
myObj.Name ="Davide";
myObj.Age = 30;


IDictionary<string, object?> dict = new Dictionary<string, object?>(myObj);

//dict.Keys: [Name, Age]

myObj.City ="Turin";

//dict.Keys: [Name, Age]

ExpandoObject를 사용하여 새 IDictionary를 만듭니다. 즉, 사전 생성 후 ExpandoObject 에 새 필드를 추가하면 해당 새 필드가 사전에 표시되지 않습니다.

IDictionary로 캐스트



IDictionary를 사용하여 ExpandoObject 키를 가져오고 ExpandoObject 상태와 동기화 상태를 유지해야 하는 경우 해당 개체를 IDictionary로 캐스팅하기만 하면 됩니다.

dynamic myObj = new ExpandoObject();
myObj.Name ="Davide";
myObj.Age = 30;

IDictionary<string, object?> dict = myObj;

//dict.Keys: [Name, Age]

myObj.City ="Turin";

//dict.Keys: [Name, Age, City]


이것은 ExpandoObjectIDictionary를 구현하기 때문에 작동하므로 새 개체를 인스턴스화하지 않고 IDictionary로 간단히 캐스팅할 수 있습니다.

다음은 클래스 정의입니다.

 public sealed class ExpandoObject : 
    IDynamicMetaObjectProvider, 
    IDictionary<string, object?>, 
    ICollection<KeyValuePair<string, object?>>, 
    IEnumerable<KeyValuePair<string, object?>>, 
    IEnumerable, 
    INotifyPropertyChanged


마무리



두 접근 방식 모두 정확합니다. 둘 다 동일한 Dictionary 를 생성하지만 새 값이 ExpandoObject 에 추가될 때 다르게 작동합니다.

각 접근 방식의 장단점을 생각해 볼 수 있습니까?

즐거운 코딩하세요!

🐧

좋은 웹페이지 즐겨찾기