获取类和命名空间中的全局变量列表
本文关键字:全局变量 列表 命名空间 获取 | 更新日期: 2023-09-27 18:03:36
我有以下类。
namespace Automate
{
class Class1
{
private bool global1;
private bool global2;
public void Method(bool param1)
{
bool flag = false;
}
}
class Class2
{
private bool global1;
private bool global2;
public void Method(bool param1)
{
bool flag = false;
}
}
}
现在我想要类1的所有全局变量&2,但不是局部变量。
例如
Class1 : Global1,Global2
Class2 : Global1,Global2
输出不应包含
`flag & param1`
我怎样才能写信给Regex?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace ConsoleApplication21
{
class Program
{
static void Main(string[] args)
{
class1 c1 = new class1();
FieldInfo[] fields = c1.GetType().GetFields(
BindingFlags.NonPublic |
BindingFlags.Instance);
Console.WriteLine("class1");
foreach (FieldInfo fi in fields)
{
Console.WriteLine(fi.Name);
}
class2 c2 = new class2();
fields = c2.GetType().GetFields(
BindingFlags.NonPublic |
BindingFlags.Instance);
Console.WriteLine("class2");
foreach (FieldInfo fi in fields)
{
Console.WriteLine(fi.Name);
}
Console.ReadKey();
}
}
public class class1
{
private string field1;
private string field2;
private void a(string hello)
{
}
}
public class class2
{
private string field3;
private string field4;
private void a(string hello)
{
}
}
}
对不起,我很快就把这些通用名称拼凑起来了。同样,重读这个问题,你想用正则表达式来实现这一点,而不是不确定你的意思,但我上面的例子会让你得到你想要的,对吗?
我假设您的问题中的代码是一个文本文件,并且您希望从中"grep"每个类的字段。
如果假设每个字段都在一行中声明,并且前面有一个访问修饰符,那么这非常容易。你只需在上grep
(public|internal|protected|private)[^(){}]*;
[^(){}]
部分确保我们不会得到属性或方法。
但是,字段也可以在没有访问修饰符的情况下声明:
class Class3
{
bool someBool;
public void Method() {
bool someBool;
}
}
如您所见,Method
中声明字段的代码和声明变量的代码完全相同。因此,使用正则表达式仅检索字段是不可能的。
解决这个问题的一种方法是查找class
关键字,然后计算大括号的数量。如果您遇到了一个{
,那么您就在类范围内,可以grep查找字段。如果您遇到两个{
,则可能是在一个方法中。当然,您还必须考虑}
,因为字段可能不会在类的顶部声明。
当代码的字符串文字中有大括号时,就会出现问题,因为这样你的大括号就不再匹配了。要真正解决这个问题,您需要一个C#解析器或C#编译器。