我正在尝试使用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;
}
因此生成可以适应任何大小的数组的代码的问题。
答案 0 :(得分:0)
您有以下解决方法来创建具有动态长度的锯齿状数组:
创建等效于
的domELEMENTTYPE[] array = (ELEMENTTYPE[])Array.CreateInstance(typeof(ELEMENTTYPE), length);
ELEMENTTYPE
可以是任何类型,无论是否为数组。
答案 1 :(得分: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));
}
答案 2 :(得分:-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;
}