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 函数并获得结果...我认为使用“二进制或(|)”传递 5 个参数不是一个好方法...在 BindingFlags 中,枚举是 19 个字段,什么如果我想传递 18 个参数 xD 我怎么能只传递一个值?

这是枚举

 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除一个标志之外的所有标志。

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 的二进制整数。请看下面的代码。

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 个参数,intbitwise ors 执行完毕后您只会传递一个,您可以放置​​无限的标志和 '|' 它们并且只会sizeof(int)传递一个参数。您可以使用

const int my_val = flag_1|flag_3|flag_5;

于 2011-08-05T10:41:33.503 回答