■ 配列変数を宣言するソースコードを自動生成するには?

[Visual Basic 初心者掲示板] [過去ログの一覧]


らきお 2008/02/06(水) 11:59:53 <中級者>
宜しくお願いいたします

CodeDomを用いて

Private Test(3, 2) As Integer

というソースコードを自動生成したいのですが
1次元配列のサンプルはあるのですが多次元配列のものがありません。

MSDNでは以下のサンプルのところで
「CodeArrayCreateExpression を入れ子にして多次元配列を作成できます」
と書いてあるのですがやり方がわかりません。

CodeArrayCreateExpression
http://msdn2.microsoft.com/ja-jp/library/system.codedom.codearraycreateexpression.aspx

どなたかご存知ないでしょうか?

大吉末吉 2008/02/06(水) 12:55:08 <中級者>
そこに、
> 配成が直接サポートされるのは、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))
こうやって使います。

らきお 2008/02/06(水) 13:07:37 <中級者>
ありがとうございます。
配列の配列ってそういうことですか(^_^;)
やはり、
Private Test(3, 2) As Integer
のようなソース生成はできないのでしょうか?

魔界の仮面弁士 2008/02/06(水) 21:06:35 <常連>
> のようなソース生成はできないのでしょうか?
できません。

その根拠は、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

らきお 2008/02/07(木) 13:40:27 <中級者>
ありがとうございました。
参考にしてやってみます。

らきお 2008/02/07(木) 13:41:00 <中級者>
[[解決]]

解決チェック忘れてました

毎週金曜日はポイント最大3倍!さらに4倍のチャンスも!

Programming Library