是否可以通过代码在Visual Studio 2012的解决方案资源管理器中执行“右键单击,添加,新项目”过程?

时间:2013-07-08 20:20:59

标签: c# visual-studio-2012 visual-studio-sdk

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

我的问题是,一旦点击该按钮,我想将我创建的自定义类对象/实体添加到当前解决方案中。我不知道(并且找不到任何有用的东西)如何通过代码添加新的自定义类,名称空间和所有内容。

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

2 个答案:

答案 0 :(得分:2)

尝试使用Dynamic compiling和另一个article

答案 1 :(得分:2)

这项技术称为metaprogramming。有一本名为"Metaprogramming in .NET"的好书,向您展示如何使用酷炫功能。

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

  1. Reflection - 用于查找有关类的信息,访问私有/受保护/内部字段和属性等。另有关于codeproject的概述:link
  2. Reflection.Emit - 提供在运行时创建新类型的能力。
  3. Expression trees - 将存储代码作为数据。它允许您以丑陋的语法生成方法(这不像IL代码那么难看),编译它们并从编译的lambda函数中获取IL代码。
  4. CodeDom - 提供模板化代码生成和动态编译。
  5. 文本模板转换工具包又名T4 - 编译前编程时间。
  6. 二进制编织 - 编译后元编程。像FodyPostSharp一样。 不是您的情况,只是为了概述
  7. 并且特殊功能:.NET的部分名称为"Dynamic Language Runtime",它为.NET提供动态类型语言的功能。有ExpandoObject类可以定义未定义的属性
  8. 因此,这是对.NET的元编程功能的简短概述。现在,关于你的情况。如果你想在解决方案的代码中添加新类,实际上是在文件系统的代码中,那么你可以自由选择,你甚至可以像文本一样编写代码。

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

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