【问题标题】:Creating dynamic class from a string containing the class definition从包含类定义的字符串创建动态类
【发布时间】:2018-01-02 14:07:39
【问题描述】:

我有一个接受表名的存储过程,然后它读取表结构并以字符串中的类定义的形式返回表结构。

例如:

string myString = 
 "
   public class TableName
   { 
     public int Column1 { get; set; } 
   }
 "

是否可以从包含类定义的字符串创建一个类/类型? 例如:-

Type type = GenerateType(myString);

我必须将此类型变量传递给我的另一段代码,所以请帮助我从包含类定义的字符串中创建类/类型。

【问题讨论】:

  • Try Roslyn。但是您打算如何处理在编译时类型未知的类的实例?
  • 您是否正在创建某种类型的ORM
  • 我认为您实际上是在寻找序列化。有很多方法可以实现这一点,这取决于您的需求和类的复杂性。通常,在许多情况下,对 Json 进行序列化就足够了。
  • 在运行时创建新类型非常复杂,你真的需要吗?我建议您寻找替代方案,也许dynamicExpandoObject 可以提供帮助吗?如果你发现你必须创建一个新类型给TypeBuilder看看。
  • 这听起来像是在开玩笑,但我不是。执行存储过程,复制它生成的类定义,然后将其粘贴到项目中的类文件中。然后您将实现您在问题中提出的要求 - 您将创建一个类型来保存存储过程的输出。

标签: c# .net dynamic-class-creation


【解决方案1】:

您可以使用 CSharpCodeProvider 在运行时编译您的结果,然后使用 Activator - Class 从您生成的代码中创建一个对象。

// compile your piece of code to dll file
Microsoft.CSharp.CSharpCodeProvider cSharpCodeProvider = new Microsoft.CSharp.CSharpCodeProvider();
System.CodeDom.Compiler.CompilerParameters compilerParameters = new System.CodeDom.Compiler.CompilerParameters();
compilerParameters.GenerateInMemory = true;
compilerParameters.GenerateExecutable = false;
System.CodeDom.Compiler.CompilerResults cResult = cSharpCodeProvider.CompileAssemblyFromSource(compilerParameters, "using System; namespace Tables { 'put here your class definition' }");

// then load your dll file, get type and object from class
Assembly assembly = cResult.CompiledAssembly;
Type myTableType = assembly.GetType("Tables.Tablename");
var finalResult = Activator.CreateInstance(myTableType);

【讨论】:

  • 非常感谢。这非常有效。节省了我的时间
  • 在“Assembly assembly = cResult.CompiledAssembly”这一行中遇到问题。如果我在执行程序集中(例如:- Main 方法在同一个程序集中),则此方法有效,但在我的场景中,此代码位于 DLL 中,我在我的启动项目中引用此 DLL。在这种情况下,我收到异常“无法加载文件或程序集”
  • 检查您的 cResult.Errors => 我建议您的代码无法编译
  • 是的,cResult 中有错误。已修复并正在工作。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 2014-11-24
相关资源
最近更新 更多