【问题标题】:How to add dynamic member name and value to an instance of ExpandoObject class?如何将动态成员名称和值添加到 ExpandoObject 类的实例?
【发布时间】:2015-05-25 08:12:48
【问题描述】:

假设存储在如下数组中的成员名称列表,

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

订单号:786451214

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

非常感谢您在高级方面的帮助。

【问题讨论】:

    标签: c# c#-4.0 expandoobject


    【解决方案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);
        }
    }
    

    但是,您应该注意上面链接的帖子的 cmets 或 Microsoft issue 中描述的这种方法可能存在的已知内存限制。我可能会重新考虑设计以考虑实际需要哪些属性,或者在可行的情况下简单地使用Dictionary(完全避免动态ExpandoObject)。

    我还将您的 Random 移到了循环之外。 Creating new instances of Random inside a loop may not give you the results you expect...

    【讨论】:

    • 没有必要修改你的new List&lt;ExpandoObject&gt;();,因为ExpandoObject实现了IDictionary。编译或运行此代码不会有任何问题。
    • 感谢您的回答。我在myDynamicClassList.Add(dynamicClass); 行的先前代码中出现重载错误,因此我已将代码从var myDynamicClassList = new List&lt;ExpandoObject&gt;(); 修改为var myDynamicClassList = new List&lt;IDictionary&lt;string, object&gt;&gt;(); 是的,我同意您的替代解决方案是类型转换,例如将代码从myDynamicClassList.Add(dynamicClass); 修改为myDynamicClassList.Add((ExpandoObject)dynamicClass);
    【解决方案2】:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Collections;
    using System.IO;
    
    namespace Deligate
    {
        class Program
        {
           public static List<Employee> empList = new List<Employee>();
            public static void UserInfo(int val)
            {
                Employee emp = new Employee();
                Console.WriteLine($"Enter {val+1} Employee Details :- ");
                Console.WriteLine("Enter Your Name: ");
                emp.Name= Console.ReadLine();
                Console.WriteLine("Enter your Email: ");
                emp.Email = Console.ReadLine();
                Console.WriteLine("Enter Mobile Number");
                emp.Mobile = Console.ReadLine();
                empList.Add(emp);
               
            }
            public static void CountEmp()
            {
                
                Console.WriteLine("How many user you want to add:");
                var UserCount = int.Parse(Console.ReadLine());
    
                for (int i = 0; i < UserCount; i++)
                {
                    UserInfo(i);
                }
                foreach (var employee in empList) {
                    Console.WriteLine(employee.Name+ ", " + employee.Email+", "+employee.Mobile);
                    
                }
                System.IO.File.Delete(@"D:\Compare.txt");
    
                foreach (var el in empList)
                {
                   System.IO.File.AppendAllText(@"D:\Compare.txt", el.Name+", "+el.Email+", "+el.Mobile + Environment.NewLine);
                    
                }
            }
             public static void Main(string[] args)
            {
                CountEmp();
                Console.ReadKey();
               
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      • 2016-03-12
      • 1970-01-01
      • 1970-01-01
      • 2022-11-29
      • 2019-08-28
      • 2011-01-05
      相关资源
      最近更新 更多