1

我正在尝试使用CodeDom生成可以执行以下操作的 C# (.Net 2.0) 代码:

int[][] myArray = new int[someSize][];

在 CodeDom 中,初始化数组需要CodeArrayCreateExpression。MSDN 说:

如果一种语言允许数组的数组,则可以通过在 CodeArrayCreateExpression 中嵌套 CodeArrayCreateExpression 来创建它们。

我理解它的方式,唯一的可能性是写这样的东西:

  // Declaration and initialization of myArray
  CodeVariableDeclarationStatement variable =
    new CodeVariableDeclarationStatement("System.Int32[][]", "myArray",
      new CodeArrayCreateExpression("System.Int32[][]",
        new CodeExpression[] { new CodeArrayCreateExpression("System.Int32[]", 0) }));

但这会产生:

int[][] myArray = new int[][] { new int[0] };

这并不完美,但如果我在生成时知道 myArray 的大小,我可以这样做,但我不知道。

我可以编写一个执行初始化的函数并在 CodeDom 中调用它,但如果我可以在纯 CodeDom 中执行它会更好。我错过了什么 ?

[编辑] 背景资料

这个想法是在两个对象表示之间自动生成一个适配器。我有一个元描述(某种 IDL)说:“我有一个容器对象,它有一个 int[][] 类型的字段”和这个容器的两个表示:

// Internal representation
public class InternalContainer {
  int[][] myArray;
}

// Network representation
public class NetworkContainer {
  int[][] myArray;
}

因此,生成可以适应任何数组大小的代码的问题。

4

3 回答 3

0

您有以下解决方法来创建具有动态长度的锯齿状数组:

创建 dom 等价于

ELEMENTTYPE[] array = (ELEMENTTYPE[])Array.CreateInstance(typeof(ELEMENTTYPE), length);

ELEMENTTYPE可以是任何类型,无论是否为数组。

于 2010-10-11T13:06:14.840 回答
0

这是我的解决方案,使用 CodeSnippetExpression

public static DOM.CodeExpression NewArray (this Type type, int dim, int size) {
  string dims = String.Concat(Enumerable.Repeat("[]", dim - 1).ToArray());
  return new DOM.CodeSnippetExpression(string.Format("new {0}[{1}]{2}", type.FullName, size, dims));
}
于 2014-07-01T16:42:31.400 回答
-1
  CodeArrayCreateExpression CodeArrayCreateExpression(Array array)
  {
     CodeArrayCreateExpression arrayCreateExpression = new CodeArrayCreateExpression(array.GetType(), array.GetLength(0));

     if (array.GetType().GetElementType().IsArray)
     {
        CodeArrayCreateExpression[] values = new CodeArrayCreateExpression[array.GetLength(0)];
        for (int j = 0; j < array.GetLength(0); j++)
        {
           values[j] = this.CodeArrayCreateExpression((Array)array.GetValue(j));
        }

        arrayCreateExpression.Initializers.AddRange(values);
     }
     else if(array.GetType().GetElementType().IsPrimitive)
     {
        CodeCastExpression[] values = new CodeCastExpression[array.GetLength(0)];
        for (int j = 0; j < values.Length; j++)
        {
           values[j] = new CodeCastExpression();
           values[j].Expression = new CodePrimitiveExpression(array.GetValue(j));
           values[j].TargetType = new CodeTypeReference(array.GetType().GetElementType());
        }

        arrayCreateExpression.Initializers.AddRange(values);
     }

     return arrayCreateExpression;
  }
于 2009-08-07T14:43:08.753 回答