保存工程时获取工程元素代码

Get project element code when saving project

这个问题将被分解成几个部分以便于理解,因为我还没有找到任何 article/tutorial。


场景

设:

ExistingClass 中什么都没有,class 就在那里。 此外,ModClass 有 2 个字段名称分别为 fieldAfieldB


问题

(1)有没有办法拦截Save事件到(2)得到ModClass的代码然后 (3) 解析它所以我得到字段例如 [我可以做那部分] 最后 (4) 自动写相关的东西直接在 ExistingClass 中(或完全重新生成 ExistingClass 的代码。

这个问题很宽泛,但正如我所说,它只是为了显示上下文。我真正想知道的是点 1 如何与点 2 一起实现,因为其余的是 material 另一个 question/research在我这边。


例子

我没有任何可验证的例子,因为如果这一切都可能的话,我真的不知道从哪里开始。不过,我仍然可以用如下所示的内容来演示这个概念。

保存事件前:

namespace MyNamespace
{
    class ExistingClass
    {
    }
}

namespace MyNamespace
{
    class ModClass
    {
        public int myInt; // This hasn't been saved yet
    }
}

保存事件后:

namespace MyNamespace
{
    class ExistingClass
    {
        enum MyEnum
        {
            myInt
        }
    }
}

namespace MyNamespace
{
    class ModClass
    {
        public int myInt;
    }
}

在这个例子中,因为 ModClass 被修改了,它的所有代码都会以某种方式被抛给解析器,解析器会获取字段(在本例中只有 myInt),然后 ExistingClass 会有一个枚举,其中包含所有已解析的字段名称。

(1) Is there a way to intercept the Save event to

您可以通过 DocumentEventsClass.DocumentSaved Event

实现

(2) get ModClass's code and then

您可以通过roslyn获取代码,更多信息请参考:

https://www.filipekberg.se/2011/10/20/using-roslyn-to-parse-c-code-files/

(3) parse it so I get the fields for example [I can do that part] and finally (4) automatically write related stuff directly in ExistingClass (or completely regenerate ExistingClass's code.

您也可以通过roslyn生成新的代码,以下示例供您参考。

Using the open source released "roslyn" to read code file and generate new code files