2009-08-07 4 views
1

다음을 수행 할 C# (.Net 2.0) 코드를 생성하기 위해 CodeDom을 사용하려고합니다.CodeDom을 사용하여 배열 배열 (또는 들쭉날쭉 한 배열)을 초기화하는 방법은 무엇입니까?

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에서 수행 할 수 있다면 더 좋을 것입니다. 내가 뭘 놓 쳤니 ?

[편집] 배경 정보

아이디어는 자동으로 두 개체 표현 사이에 어댑터를 생성하는 것입니다. "나는 int [] [] 타입의 필드를 가진 컨테이너 객체와이 컨테이너의 두 표현을 가지고있다.

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

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

모든 크기의 배열에 적용 할 수있는 코드를 생성합니다.

답변

-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; 
    } 
+0

하지만를 사용하여입니까? 그리고 나는 편집 할 수 없다. 어쨌든 일반 사례 구현에 감사드립니다. –

0

당신은 동적 길이 가변 배열을 만들려면 다음 해결 방법을 .

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)); 
} 
관련 문제