是否可以在Visual Studio 2012的解决方案资源管理器中仅通过代码执行"right-click, add, new-item"过程?



我创建了一个向导,用于显示仅使用代码生成的表单。此表单允许用户浏览某些数据库和数据集,并以选择某些数据结束。一旦他们完成了这项工作,并且一些变量已经分配/更改,表单应该只向他们显示一个"ok"按钮。到目前为止,我已经完成了所有这些。

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

如果有人对此有任何建议或经验,我们将不胜感激!

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

因此,为了元编程的目的,.NET提供了:

  1. 反射-用于查找有关类的信息,访问私有/受保护/内部字段和属性等。关于代码项目的另一个概述:链接
  2. 反射.发射-提供在运行时创建新类型的能力
  3. 表达式树-用于将代码存储为数据。它允许您生成丑陋语法的方法(不像IL代码那样丑陋),编译它们,并从编译的lambda函数中获得IL代码
  4. CodeDom-提供模板化的代码生成和动态编译
  5. 文本模板转换工具包,又名T4-堆前时间元编程
  6. 二进制编织-编译后的元编程。Smth喜欢Fody和PostSharp不是你的情况,只是为了概述
  7. 还有一个特别的功能:.NET有一个名为"动态语言运行时"的部分,它为.NET提供了动态类型语言的功能。还有一个ExpandoObject类,它可以定义未定义的属性

所以,这是对.NET元编程特性的简短概述。现在,关于您的案例。如果您想在解决方案的代码中添加新的类,实际上是在文件系统中的代码中,那么您可以自由选择什么,甚至可以将代码写成文本。

但若要将新类添加到运行时应用程序中,首先必须决定为什么需要添加新类,以及如何使用它?

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

尝试使用动态编译和其他文章。

最新更新