-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

Out Put 含むべきではない

`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" したいと思います。

各フィールドが 1 行で宣言され、その前にアクセス修飾子があると仮定すると、これは非常に簡単です。あなたは単にgrepするだけです

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

この[^(){}]部分は、プロパティやメソッドを取得しないようにします。

ただし、アクセス修飾子なしでフィールドを宣言することもできます。

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

ご覧のとおり、フィールドを宣言するコードと変数を宣言するコードMethodはまったく同じです。したがって、正規表現を使用してフィールドのみを取得することはできません。

これを解決する 1 つの方法は、キーワードを探し、classその後の中括弧の数を数えることです。に遭遇し{た場合は、クラス スコープ内にあり、フィールドを grep できます。2 つ{の が発生した場合は、おそらくメソッド内にあります。もちろん}、フィールドがクラスのトップで宣言されていない可能性があるため、考慮に入れる必要もあります。

これにより、コードの文字列リテラルに中括弧が含まれている場合に問題が発生します。これは、中括弧が一致しなくなるためです。この問題を本当に解決するには、C# パーサーまたはC# コンパイラが必要です。

于 2013-03-12T14:18:03.853 に答える