2015-03-22 2 views
1

Скажет, список имен элементов, хранящихся в массиве, как показано ниже,Как добавить динамическое имя участника и значение к экземпляру класса 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); 
      } 
     } 

Показаны выход, как этот

MemberName: 123465461

MemberName: 564613611

MemberName: 134654321

MemberName: 786451214

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

ChapterName: 123465461

Medium: 564613611

LastName: 134654321

OrderID: 786451214

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

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

ответ

1

Как описано в similar question ("Dynamically adding properties to an 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 issue. Я мог бы переосмыслить дизайн, чтобы рассмотреть, какие свойства действительно нужны, или просто использовать Dictionary, если это возможно (чтобы избежать динамического ExpandoObject полностью).

Я также переместил Random за пределы цикла. Creating new instances of Random inside a loop may not give you the results you expect...

+0

Нет необходимости изменять ваш новый список (); 'потому что' ExpandoObject' реализует 'IDictionary'. У вас не будет проблем с компиляцией или запуском этого кода. – grovesNL

+0

Благодарим вас за ответ. Я перегрузил ошибку в предыдущем коде в строке 'myDynamicClassList.Add (dynamicClass);' поэтому я изменил код из 'var myDynamicClassList = new List ();' to 'var myDynamicClassList = new List >(); 'Да, я согласен с вами, альтернативные решения - это литье типа, как изменение кода из' myDynamicClassList.Add (dynamicClass); 'to' myDynamicClassList.Add ((ExpandoObject) dynamicClass); ' – sridharnetha