ExpandoObject에 동적으로 속성 추가


233

런타임에 ExpandoObject에 속성을 동적으로 추가하고 싶습니다. 예를 들어 NewProp이라는 문자열 속성 호출을 추가하려면 다음과 같이 작성하고 싶습니다.

var x = new ExpandoObject();
x.AddProperty("NewProp", System.String);

이것은 쉽게 가능합니까?


답변:


489
dynamic x = new ExpandoObject();
x.NewProp = string.Empty;

또는

var x = new ExpandoObject() as IDictionary<string, Object>;
x.Add("NewProp", string.Empty);

32
Expando 가 IDictionary <string, object>를 구현 한다는 것을 결코 알지 못했습니다 . 나는 항상 캐스트가 그것을 사전에 복사 할 것이라고 생각했습니다. 그러나 귀하의 게시물에 따르면 사전을 변경하면 기본 ExpandoObject도 변경됩니다. 감사합니다
— Dynalon

3
점점Error 53 Cannot convert type 'System.Dynamic.ExpandoObject' to 'System.Collections.Generic.IDictionary<string,string>' via a reference conversion, boxing conversion, unboxing conversion, wrapping conversion, or null type conversion
— TheVillageIdiot

24
그것은이다 IDictionary<string, object>,하지 IDictionary<string, string>.
— Stephen Cleary

3
@ user123456 : 속성 이름은 항상 문자열입니다. 그들은 역동적 일 수 없습니다. "동적"인 경우 "런타임까지 알려지지 않음"을 의미하는 경우 두 번째 예를 사용해야합니다. "동적"인 경우 속성 값 이 동적임을 의미합니다 . 동적 값을 갖는 것은 어느 예에서나 잘 작동합니다.
— Stephen Cleary

3
캐스팅 할 때 변수 유형으로 IDictionary사용하지 않는다는 점에 유의해야 dynamic합니다.
— user3791372


14

다음은 Object를 변환하고 주어진 객체의 모든 public 속성을 가진 Expando를 반환하는 샘플 헬퍼 클래스입니다.


    public static class dynamicHelper
        {
            public static ExpandoObject convertToExpando(object obj)
            {
                //Get Properties Using Reflections
                BindingFlags flags = BindingFlags.Public | BindingFlags.Instance;
                PropertyInfo[] properties = obj.GetType().GetProperties(flags);

                //Add Them to a new Expando
                ExpandoObject expando = new ExpandoObject();
                foreach (PropertyInfo property in properties)
                {
                    AddProperty(expando, property.Name, property.GetValue(obj));
                }

                return expando;
            }

            public static void AddProperty(ExpandoObject expando, string propertyName, object propertyValue)
            {
                //Take use of the IDictionary implementation
                var expandoDict = expando as IDictionary;
                if (expandoDict.ContainsKey(propertyName))
                    expandoDict[propertyName] = propertyValue;
                else
                    expandoDict.Add(propertyName, propertyValue);
            }
        }

용법:

//Create Dynamic Object
dynamic expandoObj= dynamicHelper.convertToExpando(myObject);

//Add Custom Properties
dynamicHelper.AddProperty(expandoObj, "dynamicKey", "Some Value");

11
"var expandoDict = IDictionary로서의 expando;" 이 줄은 "var expandoDict = expando as IDictionary <String, object>;"로 변경해야합니다.
— Jom George

0

클래스 정의에 속성이 정의 된 경우와 같이 기본 값을 설정하지 않고도 원하는 유형의 새 속성을 추가한다고 생각합니다.

var x = new ExpandoObject();
x.NewProp = default(string)

5
이봐 Morteza! 코드 전용 답변으로 문제를 해결할 수 있지만 해결 방법을 설명하면 훨씬 유용합니다. 커뮤니티는 귀하의 답변을 완전히 이해하기 위해 이론뿐만 아니라 코드가 필요합니다.
— RBT
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.