とりあえず、ソフトウェア関連の記事を書くということらしいので、最近勉強中のC#のことでも。
C#には標準で、CodeDomなるソースジェネレータがあるらしい。
コレ> http://msdn2.microsoft.com/ja-jp/library/system.codedom(VS.80).aspx
せっかくなので、ちょっと使ってみた。
ソース
using System.IO;
using System.CodeDom;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using Microsoft.VisualBasic;
class CodeDomTest
{
public static void Main()
{
CodeCompileUnit compileUnit = new CodeCompileUnit();
CodeNamespace tNameSpace = new CodeNamespace("TestNameSpace");
CodeTypeDeclaration tInterface = new CodeTypeDeclaration("TestInterface");
CodeTypeDeclaration tClass = new CodeTypeDeclaration("TestClass");
CodeMemberMethod tMethod = new CodeMemberMethod();
StreamWriter tCSWriter = new StreamWriter(".CodeDomTest.cs", false);
StreamWriter tVBWriter = new StreamWriter(".CodeDomTest.vb", false);
try
{
tMethod.Name = "TestMethod";
tInterface.IsInterface = true;
tClass.IsClass = true;
tClass.BaseTypes.Add(tInterface.Name);
tClass.Members.Add(tMethod);
tNameSpace.Types.Add(tInterface);
tNameSpace.Types.Add(tClass);
compileUnit.Namespaces.Add(tNameSpace);
CSharpCodeProvider tCSprovider = new CSharpCodeProvider();
VBCodeProvider tVBprovider = new VBCodeProvider();
tCSprovider.GenerateCodeFromCompileUnit(compileUnit, tCSWriter, new CodeGeneratorOptions());
tVBprovider.GenerateCodeFromCompileUnit(compileUnit, tVBWriter, new CodeGeneratorOptions());
}
finally
{
tCSWriter.Close();
tVBWriter.Close();
}
}
}
C#出力結果(CodeDomTest.cs)
namespace TestNameSpace
{
public interface TestInterface
{
}
public class TestClass : TestInterface
{
private void TestMethod()
{
}
}
}
VB出力結果(CodeDomTest.vb)
Option Strict Off
Option Explicit On
Namespace TestNameSpace
Public Interface TestInterface
End Interface
Public Class TestClass
Inherits TestInterface
Private Sub TestMethod()
End Sub
End Class
End Namespace
一つの定義情報で、いろいろな言語が出力できるのは、なかなか面白いかも。
今回は、そんなとこで。
2件のコメント
koreyasu · 2007-05-15 23:13
ぐは、今のプロジェクトで使っているExcelからのジェネレータに使えば良かったなOrz
sato · 2007-05-17 17:41
Minakaみたいに既存のクラスからリフレクション使ってデータモデル組み立てるソースが手に入ると良いね。