在c#中获取所有枚举值的简单方法

Posted

技术标签:

【中文标题】在c#中获取所有枚举值的简单方法【英文标题】:Easy way to get all Enum values in c# 【发布时间】:2011-10-20 18:17:18 【问题描述】:

我尝试了一个小程序...我想运行一个程序并查看 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 函数并获得结果...我认为使用 'binary or(|)' 传递 5 个参数不是一个好方法...在 BindingFlags Enum 是 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,
  

我认为这是一个非常有趣和有用的问题......

【问题讨论】:

从技术上讲,你没有问问题... 如何只传递一个值? 您可以编辑问题并添加到其中。比放在评论中更好。 没有能力。您希望仅使用 1 个值返回 1 个以上的值。或者只是写一个静态方法,不要一遍又一遍地重复。 我已经回答了一个方法(很容易成为通用函数)来获取一个枚举的所有标志的值,如果更容易,你可以从中减去值。 【参考方案1】:

下面的代码应该得到一个包含所有标志的值(可以很容易地变成一个通用方法),然后你可以执行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"

【讨论】:

我不认为在这里打电话给Sum 是个好主意。如果您在枚举中定义了“掩码”或复合值,这将失败。你可能想要一个BitwiseOr() 来代替Sum() 这不是一个好方法...想象一下我只想写 19 个枚举值中的 9 个 xD 我的想象力没那么好!在那种情况下,请使用@Artur 的答案,我只是给出了我的答案,因为它保持打字安全并展示了一些不同的想法。【参考方案2】:

注意 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);

没错,这是一个非常有趣的问题。

【讨论】:

我看到的唯一问题是可读性 - 如果不知道 Enum 值,就无法判断实际使用了哪些标志。 是的,这真是太棒了……我想要的就是这个! 到目前为止所有的答案都是可行的除了这个。它会起作用,但这样做只是在自找麻烦。一个错位的10 就可以破坏东西,而这一切都只是为了节省一点打字。 如果你有 19 个标志,那么这个节省不是一点点,这有助于理解使用这个标志的工作 @Artur:是的,但是为常见用途设置一些常量,例如,将更具可读性和不易破坏性。如果我在生产代码中看到这样的东西,我不知道该笑还是该哭。【参考方案3】:

编写静态方法:

public static class BindingFlagsHelper

    public static BindingFlags GetAllMethods()
    
        return 
            BindingFlags.NonPublic | 
            BindingFlags.DeclaredOnly | 
            BindingFlags.Public | 
            BindingFlags.Instance | BindingFlags.Static;
    

【讨论】:

我想要简单快捷的方式...你的方式和我的一样,我看不出有什么不同))))【参考方案4】:

您可以使用变量来保存有趣的标志并将其传递:

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

foreach (MethodInfo mInfo in typeof(Program).GetMethods(myFlags))

     Console.WriteLine(mInfo.Name);

【讨论】:

【参考方案5】:

您不会传递 5 个参数,当 bitwise ors 执行完毕时,您只会传递一个 int,您可以放置​​无限的标志和“|”它们并且只会传递一个sizeof(int) 参数。您可以使用

制作预先计算的值

const int my_val = flag_1|flag_3|flag_5;

【讨论】:

以上是关于在c#中获取所有枚举值的简单方法的主要内容,如果未能解决你的问题,请参考以下文章

C#实现获取枚举中元素个数的方法

C#将一个枚举里面所有描述和value绑定到下拉列表的方法

从数据框中的所有列中获取值的最简单方法是啥[重复]

c#枚举类型操作方法总结-1

C#怎么调用方法

以编程方式获取所有存储过程的简单方法