5

少しプログラムを試してみました...プログラムを実行して、C#クラスのすべてのメソッド名を確認したい...コードは次のとおりです

class Program
{
    public int adf()
    {
        return 0;
    }
    static void Main(string[] args)
    {

        foreach (MethodInfo mInfo in typeof(Program).GetMethods(BindingFlags.NonPublic | BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static))
        {
            Console.WriteLine(mInfo.Name);
        }
       Console.ReadKey();
    }
    private void bdf()
    {
        Console.WriteLine("Dg");
    }
}

それはうまくいきます、結果として私はこれを手に入れました

 adf
 main
 bdf

今、私はGetMethods関数に1つのパラメータだけを渡して結果を取得したい...「binary or(|)」で5つのパラメータを渡すのは良い方法だとは思わない... BindingFlags Enumは19フィールドで、何が18個のパラメーターを渡したい場合になりますxD 1つの値のみを渡すにはどうすればよいですか?

ここに列挙型があります

 public enum BindingFlags
{
    Default = 0,
    IgnoreCase = 1,
    DeclaredOnly = 2,
    Instance = 4,
    Static = 8,
    Public = 16,
    NonPublic = 32,
    FlattenHierarchy = 64,
    InvokeMethod = 256,
    CreateInstance = 512,
    GetField = 1024,
    SetField = 2048,
    GetProperty = 4096,
    SetProperty = 8192,
    PutDispProperty = 16384,
    PutRefDispProperty = 32768,
    ExactBinding = 65536,
    SuppressChangeType = 131072,
    OptionalParamBinding = 262144,
    IgnoreReturn = 16777216,
  }
}

とても興味深く、役に立つ質問だと思います...

4

5 に答える 5

5

以下のコードは、すべてのフラグを含む値を取得する必要があります (簡単にジェネリック メソッドにすることができます)。その後AllFlags & ~FlagToRemove、1 つを除くすべてのフラグを取得することができます。

AllFlags = (EnumFlagType)Enum.GetValues(typeof(EnumFlagType))
                             .Cast<int>().Aggregate((acc, next) => acc | next);

[Flags]
enum TestEnum { one = 1, two = 2, three = 4, four = 8 };

void Main()
{

    var AllFlags = (TestEnum)Enum.GetValues(typeof(TestEnum))
                             .Cast<int>().Aggregate((acc, next) => acc | next);

    Console.WriteLine(AllFlags); // Prints "one, two, three, four"

    Console.WriteLine(AllFlags & ~two); // Prints "one, three, four"
}
于 2011-08-05T10:40:27.893 に答える
4

BindingFlags 列挙体の本体に注意してください。すべての値は 2 のべき乗です。したがって、バイナリまたは単に提供された整数値の合計を計算します。すべてのフラグを渡すには、すべての int 値の合計を送信するだけです。一部の値のみを渡すには、渡す必要があるフラグの対応する位置に 1 を含む 2 進整数を送信します。以下のコードを参照してください。

BindingFlags flag = (BindingFlags)Convert.ToInt32("0000010010000101010", 2)

あなたの例は

BindingFlags flag = (BindingFlags)Convert.ToInt32("111110", 2)

を印刷するflagと、

DeclaredOnly, Instance, Static, Public, NonPublic

そして、あなたはメソッドを得ることができます

            Type t = typeof(Program);
            MethodInfo[] mi = t.GetMethods(flag);

そうです、それは本当に興味深い質問です。

于 2011-08-05T10:38:45.257 に答える
3

静的メソッドを書きます:

public static class BindingFlagsHelper
{
    public static BindingFlags GetAllMethods()
    {
        return 
            BindingFlags.NonPublic | 
            BindingFlags.DeclaredOnly | 
            BindingFlags.Public | 
            BindingFlags.Instance | BindingFlags.Static;
    }
}
于 2011-08-05T10:38:47.903 に答える
3

変数を使用して興味深いフラグを保持し、それを渡すことができます。

BindingFlags myFlags = BindingFlags.NonPublic | BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static;

foreach (MethodInfo mInfo in typeof(Program).GetMethods(myFlags))
{
     Console.WriteLine(mInfo.Name);
}
于 2011-08-05T10:40:00.087 に答える
2

5 つのパラメーターを渡すことはありません。sの実行が完了intしたときに1 つだけを渡すことになります。無制限のフラグと '|' を置くことができます。bitwise orそれらと 1 つのsizeof(int)パラメーターのみが渡されます。で事前計算された値を作成できます

const int my_val = flag_1|flag_3|flag_5;

于 2011-08-05T10:41:33.503 に答える