とりあえず、ソフトウェア関連の記事を書くということらしいので、最近勉強中の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みたいに既存のクラスからリフレクション使ってデータモデル組み立てるソースが手に入ると良いね。

現在コメントは受け付けていません。