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;
}
}