-4

我有以下课程。

  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`

我该如何编写正则表达式来做到这一点?

4

2 回答 2

0
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)
        {

        }
    }
}

对不起,我很快就把它放在一起了。还要重新阅读你想要一种方法来使用正则表达式而不是不确定你的意思的问题,但我上面的例子会让你得到你想要的吗?

于 2013-03-12T14:15:11.477 回答
0

我假设您将问题中的代码作为文本文件,并且您想从它们中“grep”每个类的字段。

如果您假设每个字段都在一行上声明并在其前面有一个访问修饰符,那么这很容易。你只需 grep

(public|internal|protected|private)[^(){}]*;

[^(){}]部分确保我们不会获得属性或方法。

但是,也可以在没有访问修饰符的情况下声明字段:

class Class3 
{
    bool someBool;
    public void Method() {
        bool someBool;
    }
}

如您所见,声明字段的代码和声明变量的代码Method完全相同。因此,不可能使用正则表达式仅检索字段。

解决此问题的一种方法是查找class关键字,然后计算大括号的数量。如果你遇到了一个{,你就在类范围内,你可以 grep 查找字段。如果你遇到了两个{,你可能是在一个方法中。当然你也得考虑}到,因为字段可能不会在类的顶部声明。

当代码在字符串文字中有大括号时,这会出现问题,因为这样您的大括号不再匹配。要真正真正解决这个问题,您需要一个C# 解析器C# 编译器

于 2013-03-12T14:18:03.853 回答