2008年5月10日土曜日

文字列指定したクラスのインスタンス作成

のメモ。
// namespaceを取得
String ns = this.GetType().Namespace;

// ClassAのTypeを取得
Type type = Type.GetType(String.Format("{0}.{1}", ns, "ClassA"), false);

// ClassAのインスタンス作成
ClassA a = Activator.CreateInstance(type) as ClassA;
↑は既にクラスを定義してあり、アセンブリも読み込んでいる必要があるが、 文字列から動的にクラス自体を作ることも出来る。
プログラムからソース・コードをコンパイルして実行するには?
必要な部分だけ抜粋しておく。
using System;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.Reflection;

public class CompileInvoke {
  static string cs = @"
    public class CSHello {
      public static void Main() {
        System.Console.WriteLine(""Hello C# World!"");
      }
    }";

  public static void Main() {
    CSharpCodeProvider cscp = new CSharpCodeProvider();
    ICodeCompiler cc = cscp.CreateCompiler();

    CompilerParameters param = new CompilerParameters();
    param.GenerateInMemory = true;

    CompilerResults cr = cc.CompileAssemblyFromSource(param, cs);
    Assembly asm = cr.CompiledAssembly;

    Type type = asm.GetType("CSHello");

    MethodInfo mi = type.GetMethod("Main");
    mi.Invoke(null, null);  // 出力:Hello C# World!"
  }
}

0 件のコメント: