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

解決


らきお  2008-02-06 20:59:53  No: 138865

宜しくお願いいたします

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 21:55:08  No: 138866

そこに、
> 配成が直接サポートされるのは、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 22:07:37  No: 138867

ありがとうございます。
配列の配列ってそういうことですか(^_^;)
やはり、
Private Test(3, 2) As Integer
のようなソース生成はできないのでしょうか?


魔界の仮面弁士  2008-02-07 06:06:35  No: 138868

> のようなソース生成はできないのでしょうか?
できません。

その根拠は、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 22:40:27  No: 138869

ありがとうございました。
参考にしてやってみます。


らきお  2008-02-07 22:41:00  No: 138870

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加