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版本的机器代码,而不是源代码。我仍然认为您应该在构建时找到所有需要检查的类,然后进行检查。