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 でそれを実行できればさらに便利です。私は何か見落としてますか ?

[編集] 背景情報

アイデアは、2 つのオブジェクト表現間のアダプターを自動的に生成することです。「int [] [] 型のフィールドを持つコンテナ オブジェクトがあります」というメタ記述 (ある種の IDL) と、このコンテナの 2 つの表現があります。

// 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 に答える