Подтвердить что ты не робот

Свойства Loop DynamicObject

Я пытаюсь понять тип DynamicObject. Эта статья MSDN была очень конкретизирована и понятна как создать и использовать DynamicObject:

http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.aspx

В статье содержится простой класс DynamicDictionary, который наследуется от DynamicObject.

Теперь я хочу перебрать мои динамически созданные свойства DynamicObject:

dynamic d = new DynamicDictionary();
d.Name = "Myname";
d.Number = 1080;

foreach (var prop in d.GetType().GetProperties())
{
  Console.Write prop.Key;
  Console.Write prop.Value;
}

Очевидно, что это не сработает. Я хочу узнать, как это сделать без изменения моего класса DynamicDictionary, поскольку я действительно пытаюсь научиться использовать это для всех видов существующих объектов, которые наследуются от DynamicObject.

Требуется ли отражение? Мне что-то не хватает...

4b9b3361

Ответ 2

Я считаю, что вас интересует класс ExpandoObject. Класс DynamicObject - это просто база, где вы должны предоставить всю логику. Он явно реализует интерфейс IDictionary<string, object>, чтобы вы могли получить доступ к его свойствам или добавить новые таким образом.

// declare the ExpandoObject
dynamic expObj = new ExpandoObject();
expObj.Name = "MyName";
expObj.Number = 1000;

// print the dynamically added properties
foreach (KeyValuePair<string, object> kvp in expObj) // enumerating over it exposes the Properties and Values as a KeyValuePair
    Console.WriteLine("{0} = {1}", kvp.Key, kvp.Value);

// cast to an IDictionary<string, object>
IDictionary<string, object> expDict = expObj;

// add a new property via the dictionary reference
expDict["Foo"] = "Bar";

// verify it been added on the original dynamic reference
Console.WriteLine(expObj.Foo);

Я только что понял, что вы реализуете класс DynamicDictionary и неправильно понимаете свой вопрос. К сожалению.

При использовании с динамической ссылкой у вас есть доступ только к открытым участникам. Поскольку только Count объявляется общедоступным (помимо других членов DynamicObject), вам нужно будет использовать отражение, чтобы получить доступ к внутреннему словарю, чтобы легко получить эти значения (если вы не намерены вносить какие-либо дальнейшие изменения).