C# 如何在C中生成新类型

C# 如何在C中生成新类型,c#,il,C#,Il,我真的想在运行时生成一个新类型。本质上,我想创建如下类型: public class MySpecial123 { public Func<int, DateTime, int> salesVectorCalc; // field public int CallSalesVectorCalculation(int i, DateTime d) ( return salesVectorCalc(i, d); ) } 有些类型会根据用户

我真的想在运行时生成一个新类型。本质上,我想创建如下类型:

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

    public int CallSalesVectorCalculation(int i, DateTime d)
    (
        return salesVectorCalc(i, d);
    )
}
有些类型会根据用户/DB输入的不同而有所不同,因此我无法用其他方法在运行时创建类型。还有更复杂的问题,但我想让我的问题变得简单,所以我在这里只问一些基本的问题。我需要做更多的事情,就像你们在这里看到的那样


我原以为使用Reflection.Emit会很酷,但后来我意识到,在内存中生成代码和编译代码可能更容易。有人知道哪个更好吗?我真的很想看一个例子来说明如何执行这两种操作。

当你说在运行时生成一个类型时,听起来好像你在要求动态类型

在C4.0中,只需使用dynamic关键字即可


但是,您还描述了类似于代码生成的内容—如果这更符合您的要求,为什么不在预编译阶段使用T4模板之类的内容来生成类型?

将代码生成为字符串,然后动态编译到内存中的程序集是非常容易的。然后,您可以通过以下方式调用方法并访问字段:

使用反射 使用动态关键字 如果新类继承自接口/基类,则强制转换为接口/基类 代码:


实际上,您不应该希望这样。Dynamic允许您使用动态类型。这无助于创建它们。
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;
    }
}