C#检查字段赋值方法体的反射

C#检查字段赋值方法体的反射,c#,reflection,compilation,lint,C#,Reflection,Compilation,Lint,对于以下类别: class A { private List<int> intList; private List<bool> boolList; public InitializeClass() { intList = new List<int>(); } } A类 { 私人名单; 私人列表布利斯特; 公共初始化类() { intList=新列表(); } } 我想使用反射来编写一个linter

对于以下类别:

class A
{
    private List<int> intList;
    private List<bool> boolList;

    public InitializeClass()
    {
        intList = new List<int>();
    }

}
A类
{
私人名单;
私人列表布利斯特;
公共初始化类()
{
intList=新列表();
}
}
我想使用反射来编写一个linter/post编译器,检查某个方法是否真的对类的字段赋值。目的是自动检查我自己的错误。该类无法使用构造函数,因此我需要手动调用
InitializeClass()


我有
MethodInfo方法
和类的所有字段
FieldInfo[/fields
,我想检查这些字段,但不知道如何从这里开始。从上面的示例中,它应该能够检测到我没有为方法体中的
boolList
分配任何内容。

我最终使用正则表达式直接读取代码文件。 该文件有一些限制,即它可以包含无限的方法,但每个方法不能包含任何括号。(如果没有,等等)


然后我使用
“({)(.*)(})”
并选择第二组以消除类的括号,然后从中使用
“{(.*)}”
并迭代每个方法体的匹配。(实际上,我不关心方法的名称,我想检查整个文件)之后,我逐行读取方法的内容,并用“=”或“.”等字符分割内容。

我最终使用正则表达式直接读取代码文件。 该文件有一些限制,即它可以包含无限的方法,但每个方法不能包含任何括号。(如果没有,等等)


然后我使用
“({)(.*)(})”
并选择第二组以消除类的括号,然后从中使用
“{(.*)}”
并迭代每个方法体的匹配。(实际上,我不关心方法的名称,我想检查整个文件)之后,我逐行读取方法的内容,并用“=”或“.”等字符分割内容。

您有什么理由需要从编译的代码中执行此操作吗?使用Roslyn API将是一种更简单的代码分析方法。是的,这实际上是Unity3D插件。Unity可以在程序本身编译后运行任何C#静态方法,因此我想在那里运行检查器来分析我在当前场景中使用的所有脚本。但是,您实际上不知道在构建时要检查的代码吗?与构建时相比,您愿意付出多少努力来支持在执行时这样做?我怀疑找到一个在Unity上工作的IL解析库将是一项艰巨的任务。我用属性和Unity命令的组合标记了我想要检查的类,它可以扫描场景中的所有所述类。目前我已经可以访问我要检查的方法的
MethodInfo
。我想我必须使用
MethodBody.GetILAsByteArray
方法,并根据“=”字符分割每一行,然后检查左侧是否有匹配的名称?不,因为方法体是IL。没有行的概念,而且
=
字符。。。这是CLR版本的机器代码,而不是源代码。我仍然认为您应该在构建时找到所有需要检查的类,然后进行检查。有什么理由需要从编译的代码中进行检查吗?使用Roslyn API将是一种更简单的代码分析方法。是的,这实际上是Unity3D插件。Unity可以在程序本身编译后运行任何C#静态方法,因此我想在那里运行检查器来分析我在当前场景中使用的所有脚本。但是,您实际上不知道在构建时要检查的代码吗?与构建时相比,您愿意付出多少努力来支持在执行时这样做?我怀疑找到一个在Unity上工作的IL解析库将是一项艰巨的任务。我用属性和Unity命令的组合标记了我想要检查的类,它可以扫描场景中的所有所述类。目前我已经可以访问我要检查的方法的
MethodInfo
。我想我必须使用
MethodBody.GetILAsByteArray
方法,并根据“=”字符分割每一行,然后检查左侧是否有匹配的名称?不,因为方法体是IL。没有行的概念,而且
=
字符。。。这是CLR版本的机器代码,而不是源代码。我仍然认为您应该在构建时找到所有需要检查的类,然后进行检查。