在运行时从 C# 中的 ArrayList 生成自定义对象

Generating Custom Object from ArrayList in C# at runtime

我将以下内容作为纯字符串存储在 ArrayList 中,每一行代表列表中一项的值,有没有办法生成以下样式的动态对象: [左操作数是 属性] = [右操作数是 属性]

的值
object.data.details[1].tid=711
object.data.details[1].type="ongoing"
object.data.details[1].attach="node1"
object.data.details[1].flowing[1].comid="component1"
object.data.details[1].flowing[1].system-usage.RAM="12%"
object.data.details[1].flowing[1].system-usage.CPU="3%"
object.data.details[1].flowing[1].system-usage.Pages=3
object.data.details[1].flowing[2].comid="component2"
object.data.details[1].flowing[2].system-usage.RAM="9%"
object.data.details[1].flowing[2].system-usage.CPU="2%"
object.data.details[1].flowing[2].system-usage.Pages=1
object.data.details[1].flowing[3].comid="component3"
object.data.details[1].flowing[3].system-usage.RAM="7%"
object.data.details[1].flowing[3].system-usage.CPU="7%"
object.data.details[1].flowing[3].system-usage.Pages=5
object.data.details[2].tid=712
object.data.details[2].type="ongoing"
object.data.details[2].attach="node2"
object.data.details[2].flowing[1].comid="component1"
object.data.details[2].flowing[1].system-usage.RAM="12%"
object.data.details[2].flowing[1].system-usage.CPU="3%"
object.data.details[2].flowing[1].system-usage.Pages=3
object.data.details[2].flowing[2].comid="component2"
object.data.details[2].flowing[2].system-usage.RAM="9%"
object.data.details[2].flowing[2].system-usage.CPU="2%"
object.data.details[2].flowing[2].system-usage.Pages=1
object.data.details[2].flowing[3].comid="component3"
object.data.details[2].flowing[3].system-usage.RAM="7%"
object.data.details[2].flowing[3].system-usage.CPU="7%"
object.data.details[2].flowing[3].system-usage.Pages=5
object.data.details[3].tid=713
object.data.details[3].type="ongoing"
object.data.details[3].attach="node2"
object.data.details[3].flowing[1].comid="component1"
object.data.details[3].flowing[1].system-usage.RAM="12%"
object.data.details[3].flowing[1].system-usage.CPU="3%"
object.data.details[3].flowing[1].system-usage.Pages=3
object.data.details[3].flowing[2].comid="component2"
object.data.details[3].flowing[2].system-usage.RAM="9%"
object.data.details[3].flowing[2].system-usage.CPU="2%"
object.data.details[3].flowing[2].system-usage.Pages=1
object.data.details[3].flowing[3].comid="component3"
object.data.details[3].flowing[3].system-usage.RAM="7%"
object.data.details[3].flowing[3].system-usage.CPU="7%"
object.data.details[3].flowing[3].system-usage.Pages=5

我希望有一个具有以下结构的对象:

object.data.details[i].flowing[j].comid="component1"
if i=j=1
object.data.details[i].flowing[j].system-usage.RAM="9%"
if i=1 and j=2

换句话说,我需要生成一个动态对象,它可以将数组列表作为属性列表,就像我们可以使用 :

访问 asp.net gridview 中显示的任何值一样
gridview1.rows[i].someproperty[j].value = "something"

我尝试使用 ExpandoObject 但也失败了我尝试使用反射但是如果我在同一个线程中生成 ~1K 对象它会消耗大量内存。

好的,伙计们,我想出了如何做到这一点,以防有人遇到这个问题,这里是解决方案:

  1. 您必须使用点 (.) 和指针标记每一行以跟踪索引,您应该使用带有 ref 关键字的指针以跳过 SQUARED_OPEN 和 SQUARED_CLOSED 个字符以及中间的索引

  2. 您将需要拥有以下对象

    ExpandoObject expandoObject = new ExpandoObject();
    IDictionary objects = expandoObject;
    
  3. 您需要构建一个递归方法,该方法能够将第一级标记化字符串(第一个标记)添加为字典键,其值为 expando 对象。

  4. 将每行中剩余的字符串添加为 expando

  5. 的值
  6. 将已存储为 expando 对象的剩余字符串标记化,然后重复 3,4

仅此而已。您将拥有一个 expando 对象,它允许您通过链接属性来访问任何值,例如:

<pre>
var x = data.details[1].flowing[2].system_usage.Pages;
</pre>