0

実行時に新しい型を生成したいのです。基本的に、次のようなタイプを作成したいと思います。

public class MySpecial123
{
    public Func<int, DateTime, int> salesVectorCalc; // field

    public int CallSalesVectorCalculation(int i, DateTime d)
    (
        return salesVectorCalc(i, d);
    )
}

一部の型はユーザー/DB の入力によって異なるため、実行時に型を作成する以外の方法では実現できません。もっと複雑なこともありますが、質問を簡単にしたかったので、ここでは本質的な質問だけをしています. ここに表示されているものよりも多くの生成を行う必要があります。

を使用するのはクールだと思っていましたがReflection.Emit、コードを生成してすべてをメモリ内でコンパイルする方が簡単かもしれないことに気付きました。どちらが良いか知っている人はいますか?これらのいずれかを行う方法の例を本当に見たいです。

4

2 に答える 2

5

「実行時に型を生成する」と言うと、動的型付けを求めているように聞こえます。

C# 4.0 では、dynamic キーワードを使用するだけで済みます。

ただし、コード生成に似たものについても説明しています。これが目的である場合は、T4 テンプレートのようなものを使用して、「プリコンパイル」フェーズで型を生成してみませんか?

于 2011-05-03T23:50:56.807 に答える
2

コードを文字列として生成し、それをメモリ内アセンブリに動的にコンパイルするのは非常に簡単です。次に、メソッドを呼び出して、次のいずれかの方法でフィールドにアクセスできます。

  • リフレクションを使用する
  • 動的キーワードの使用
  • インターフェイス/基本クラスへのキャスト(新しいクラスが1つから継承する場合)

コード:

public static Assembly Compile(string source)
{
    var codeProvider = new CSharpCodeProvider(new Dictionary<String, String> { { "CompilerVersion", "v4.0" } });
    var compilerParameters = new CompilerParameters();

    compilerParameters.ReferencedAssemblies.Add("System.dll");
    compilerParameters.ReferencedAssemblies.Add("System.Core.dll");
    compilerParameters.ReferencedAssemblies.Add("System.Xml.dll");
    compilerParameters.ReferencedAssemblies.Add("System.Xml.Linq.dll");
    compilerParameters.CompilerOptions = "/t:library";
    compilerParameters.GenerateInMemory = true;

    var result = codeProvider.CompileAssemblyFromSource(compilerParameters, source);
    if (result.Errors.Count > 0)
    {
        foreach (CompilerError error in result.Errors)
        {
            Debug.WriteLine("ERROR Line {0:000}: {1}", error.Line, error.ErrorText);
        }
        return null;
    }
    else
    {
        return result.CompiledAssembly;
    }
}
于 2011-05-04T00:32:18.503 に答える