Как добавить имя и значение динамического члена в экземпляр класса ExpandoObject?

Скажем, список имен членов, хранящихся в массиве, как показано ниже,

string[] myMembers = { "ChapterName", "Medium", "LastName", "OrderID" };

Я написал следующий код для создания динамического класса и членов вместе со случайными значениями.

var myDynamicClassList = new List<ExpandoObject>();
        foreach (var MemberName in myMembers)
        {
            dynamic dynamicClass = new ExpandoObject();
            dynamicClass.MemberName = new Random().Next();
            myDynamicClassList.Add(dynamicClass);
        }

Чтобы отобразить вывод вышеуказанного myDynamicClassList, я написал следующий код.

foreach (var x in myDynamicClassList)
        {
            foreach (var property in (IDictionary<String, Object>)x)
            {
                Console.WriteLine(property.Key + ": " + property.Value);
            }
        }

Отображение вывода, как это

Имя участника: 123465461

Имя участника: 564613611

Имя участника: 134654321

Имя пользователя: 786451214

Но вместо приведенного выше вывода я ожидаю вывод, как показано ниже

Название главы: 123465461

Средний : 564613611

Фамилия : 134654321

ID заказа: 786451214

Вот мой вопрос, можно ли добавить имя динамического члена в динамический класс в С#. Если это возможно, пожалуйста, дайте мне знать, если нет, пожалуйста, помогите мне выполнить эту работу.

Я очень ценю вашу помощь в продвинутом уровне.


person sridharnetha    schedule 22.03.2015    source источник


Ответы (1)


Как описано в подобном вопросе ("Динамическое добавление свойств к ExpandoObject") , вы можете сделать это, используя IDictionary напрямую:

string[] myMembers = { "ChapterName", "Medium", "LastName", "OrderID" };
var myDynamicClassList = new List<ExpandoObject>();
Random random = new Random();
foreach (var MemberName in myMembers)
{
    IDictionary<string, object> dynamicClass = (IDictionary<string, object>)(new ExpandoObject());
    dynamicClass.Add(MemberName, random.Next());
    myDynamicClassList.Add((ExpandoObject)dynamicClass);
}
foreach (var x in myDynamicClassList)
{
    foreach (var property in (IDictionary<String, Object>)x)
    {
        Console.WriteLine(property.Key + ": " + property.Value);
    }
}

Однако вы должны знать о возможных известных ограничениях памяти с помощью этого метода, как описано в комментариях к сообщению, указанному выше, или в проблема Microsoft. Я бы, возможно, переосмыслил дизайн, чтобы учесть, какие свойства действительно необходимы, или просто использовал бы Dictionary, если это возможно (чтобы полностью избежать динамического ExpandoObject).

Я также переместил ваш Random за пределы цикла. Создание новых экземпляров Random внутри цикла может не дать ожидаемых результатов. ...

person grovesNL    schedule 22.03.2015
comment
Нет необходимости изменять ваш new List<ExpandoObject>();, потому что ExpandoObject реализует IDictionary. У вас не возникнет проблем с компиляцией или запуском этого кода. - person grovesNL; 22.03.2015
comment
Спасибо за ваш ответ. Я получил перегруженную ошибку в предыдущем коде в строке myDynamicClassList.Add(dynamicClass);, поэтому я изменил код с var myDynamicClassList = new List<ExpandoObject>(); на var myDynamicClassList = new List<IDictionary<string, object>>(); Да, я согласен с вами, альтернативные решения - это приведение типов, например изменение кода с myDynamicClassList.Add(dynamicClass); на myDynamicClassList.Add((ExpandoObject)dynamicClass); - person sridharnetha; 22.03.2015