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.