如何将动态成员名称和值添加到ExpandoObject类的实例?

时间:2015-03-22 06:17:40

标签: c# c#-4.0 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

但是,除了上面的输出,我期待输出如下

  

ChapterName:123465461

     

中:564613611

     

姓氏:134654321

     

订单ID:786451214

这是我的问题,是否可以在c#中为动态类添加动态成员名称。如果有可能请告诉我,如果没有,请指导我完成这项工作。

我非常感谢你提前帮助。

1 个答案:

答案 0 :(得分: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...