宜しくお願いいたします
CodeDomを用いて
Private Test(3, 2) As Integer
というソースコードを自動生成したいのですが
1次元配列のサンプルはあるのですが多次元配列のものがありません。
MSDNでは以下のサンプルのところで
「CodeArrayCreateExpression を入れ子にして多次元配列を作成できます」
と書いてあるのですがやり方がわかりません。
CodeArrayCreateExpression
http://msdn2.microsoft.com/ja-jp/library/system.codedom.codearraycreateexpression.aspx
どなたかご存知ないでしょうか?
そこに、
> 配成が直接サポートされるのは、1 次元配列だけです。
> 配列の配列
って書いてありますよね?
> Private Test(3, 2) As Integer
こういう配列では無く、
> Private Test0(2) As Integer
> Private Test1(2) As Integer
> Private Test2(2) As Integer
> Private Test3(2) As Integer
> Private Test()() As Integer = {Test0, Test1, Test2, Test3}
こういう配列の事を言っているのでは?
ちなみに、
> MsgBox(Test(0)(1))
こうやって使います。
ありがとうございます。
配列の配列ってそういうことですか(^_^;)
やはり、
Private Test(3, 2) As Integer
のようなソース生成はできないのでしょうか?
> のようなソース生成はできないのでしょうか?
できません。
その根拠は、System.CodeDom.Compiler.GeneratorSupport 列挙体を SDK で
調べると、「MultidimensionalArrays」に対して下記の解説があるからです。
>> Currently, the CodeDom cannot be used to instantiate multidimensional arrays.
>> 現在、CodeDom を使用して多次元配列をインスタンス化することはできません。
しかし、方法が無いわけでもありません。
たとえば今回の 2 次元配列を作るために、このようなモデルを記述できます。
Dim provider As CodeDomProvider
provider = New Microsoft.VisualBasic.VBCodeProvider()
'provider = New Microsoft.CSharp.CSharpCodeProvider()
'provider = New Microsoft.JScript.JScriptCodeProvider()
If Not provider.Supports(GeneratorSupport.MultidimensionalArrays) Then
Return
End If
Dim ArrayName As String = "Test"
Dim ArrayMaxIndex1 As Integer = 3
Dim ArrayMaxIndex2 As Integer = 2
Dim arrayInstance As New CodeMethodInvokeExpression( _
New CodeTypeReferenceExpression(GetType(Array)), "CreateInstance", _
New CodeTypeOfExpression(New CodeTypeReference(GetType(Integer))), _
New CodePrimitiveExpression(ArrayMaxIndex1 + 1), _
New CodePrimitiveExpression(ArrayMaxIndex2 + 1))
Dim variable As New CodeVariableDeclarationStatement( _
GetType(Integer(,)), ArrayName, _
New CodeCastExpression(GetType(Integer(,)), arrayInstance))
Dim statements As New CodeStatementCollection()
statements.Add(New CodeCommentStatement(String.Format("配列{0}の宣言", ArrayName)))
statements.Add(variable)
Using sw As New StringWriter()
For Each s As CodeStatement In statements
provider.GenerateCodeFromStatement(s, sw, Nothing)
Next
Dim GeneratedSource As String = sw.ToString()
Clipboard.SetText(GeneratedSource)
Label1.Text = GeneratedSource
End Using
ありがとうございました。
参考にしてやってみます。
解決チェック忘れてました
ツイート | ![]() |