1

我创建了一个向导,它显示了仅使用代码生成的表单。此表单允许用户浏览一些数据库和数据集,最后选择一些数据。一旦他们完成了这些并且一些变量已经分配/更改,表单应该只显示一个“确定”按钮。到目前为止,我已经完成了所有这些。

我的问题是,一旦单击该按钮,我想将我创建的自定义类对象/实体添加到当前解决方案中。我不知道(也找不到任何有帮助的东西)如何仅通过代码添加新的自定义类、命名空间等。

如果有人对此有任何指示或经验,将不胜感激!

4

2 回答 2

2

尝试使用动态编译和另一篇文章

于 2013-07-08T20:27:49.943 回答
2

这种技术称为元编程。有一本名为“.NET 中的元编程”的好书向您展示了如何使用很酷的功能。

因此,出于元编程目的,.NET 提供:

  1. 反射- 用于查找有关类的信息,以访问私有/受保护/内部字段和属性等。还有另一个关于 codeproject 的概述:链接
  2. Reflection.Emit - 提供在运行时创建新类型的能力。
  3. 表达式树- 用于将代码存储为数据。它允许您以难看的语法(不像 IL 代码那么难看)生成方法,编译它们并从编译的 lambda 函数中获取 IL 代码。
  4. CodeDom - 提供模板代码生成和动态编译。
  5. 文本模板转换工具包又名 T4 - 编译时元编程之前。
  6. Binary Weaving - 编译后元编程。像 FodyPostSharp一样不是你的情况,只是为了概述
  7. 以及特殊功能:.NET 有一个名为“Dynamic Language Runtime”的部分,它为.NET 提供了动态类型语言的功能。ExpandoObject类可让您定义未定义的属性

以上就是对 .NET 元编程特性的简短概述。现在,关于你的情况。如果你想在你的解决方案的代码中添加新的类,真的是在文件系统中的代码中,那么你可以自由选择,你甚至可以像文本一样编写代码。

但是如果你想在运行时应用程序中添加新类,首先你必须确定为什么需要添加新类,你将如何使用它?

所以,主要思想:首先你描述类,然后将它添加到运行时。现在你有丑陋的语法来创建这个类的对象。它可以是Activator.CreateInstance(yourRuntimeTypeInfo)yourRuntimeTypeInfo.GetConstructor(...).Invoke(...)。接下来是什么?在编译时从这个创建方法中得到的只是一个对象。您必须使用反射,查找方法,调用它:yourRuntimeTypeInfo.GetMethod(...).Invoke(...)。或者您可以使用表达式树生成方法信息,确定所有数据库类的基本类;并以某种方式在基本类中使用生成的方法。或者有办法。不要添加新类型,只使用 ExpandoObject(或 ElasticObject),并将他的方法描述为 lambdas;之后都只是调用方法。或者你甚至可以只使用字典。或者你可以多考虑​​一下,在没有元编程的情况下找到解决方案。

于 2013-07-08T21:58:10.753 回答