Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C-按属性获取所有枚举值_C#_Enums_Attributes - Fatal编程技术网

C# C-按属性获取所有枚举值

C# C-按属性获取所有枚举值,c#,enums,attributes,C#,Enums,Attributes,我有以下枚举: public enum KodEnum { [EnumType(EnumType = "Task")] TaskTab, [EnumType(EnumType = "Task")] TaskReason, [EnumType(EnumType = "Action")] ActionTab, [EnumType(EnumType = "Action")] ActionReason } public class Enu

我有以下枚举:

public enum KodEnum
{
    [EnumType(EnumType = "Task")]
    TaskTab,
    [EnumType(EnumType = "Task")]
    TaskReason,
    [EnumType(EnumType = "Action")]
    ActionTab,
    [EnumType(EnumType = "Action")]
    ActionReason
}

public class EnumTypeAttribute : Attribute
{
    public string EnumType { get; set; }
}
我想得到一个任务类型为EnumType的所有枚举的列表


我该怎么做呢?

像这样的事情应该会让你走上正轨

var enumValues = (from member in typeof(KodEnum).GetFields()
                  let att = member.GetCustomAttributes(false)
                                  .OfType<EnumTypeAttribute>()
                                  .FirstOrDefault()
                  where att != null && att.EnumType == "Task"
                  select member.GetValue(null))
                 .Cast<KodEnum>()
                 .ToList();
如果需要int值,则只需强制转换它:

var enumValues = (from member in typeof(KodEnum).GetFields()
                  let att = member.GetCustomAttributes(false)
                                  .OfType<EnumTypeAttribute>()
                                  .FirstOrDefault()
                  where att != null && att.EnumType == "Task"
                  select (int)member.GetValue(null))
                 .ToList();
以及所有lambda解决方案:

        var enumValues = typeof(KodEnum)
            .GetFields()
            .Select(x => new 
                { 
                    att = x.GetCustomAttributes(false)
                             .OfType<EnumTypeAttribute>()
                             .FirstOrDefault(), 
                    member = x 
                })
            .Where(x => x.att != null && x.att.EnumType == "Task")
            .Select(x => (int)x.member.GetValue(null))
            .ToList();

像这样的事情应该会让你走上正轨

var enumValues = (from member in typeof(KodEnum).GetFields()
                  let att = member.GetCustomAttributes(false)
                                  .OfType<EnumTypeAttribute>()
                                  .FirstOrDefault()
                  where att != null && att.EnumType == "Task"
                  select member.GetValue(null))
                 .Cast<KodEnum>()
                 .ToList();
如果需要int值,则只需强制转换它:

var enumValues = (from member in typeof(KodEnum).GetFields()
                  let att = member.GetCustomAttributes(false)
                                  .OfType<EnumTypeAttribute>()
                                  .FirstOrDefault()
                  where att != null && att.EnumType == "Task"
                  select (int)member.GetValue(null))
                 .ToList();
以及所有lambda解决方案:

        var enumValues = typeof(KodEnum)
            .GetFields()
            .Select(x => new 
                { 
                    att = x.GetCustomAttributes(false)
                             .OfType<EnumTypeAttribute>()
                             .FirstOrDefault(), 
                    member = x 
                })
            .Where(x => x.att != null && x.att.EnumType == "Task")
            .Select(x => (int)x.member.GetValue(null))
            .ToList();

关键词是反射:

你试过这样的东西吗

Enum.GetValues(typeof(KodEnum))
    .OfType<KodEnum>()
    .Where(o => o.GetType()
        .GetCustomAttributes(typeof(EnumTypeAttribute), false)
        .OfType<EnumTypeAttribute>()
        .FirstOrDefault()
        .EnumType == "Task");

关键词是反射:

你试过这样的东西吗

Enum.GetValues(typeof(KodEnum))
    .OfType<KodEnum>()
    .Where(o => o.GetType()
        .GetCustomAttributes(typeof(EnumTypeAttribute), false)
        .OfType<EnumTypeAttribute>()
        .FirstOrDefault()
        .EnumType == "Task");
你可以这样做:

var result = Enum.GetValues(typeof(KodEnum)).OfType<KodEnum>()  
                 .Where(x=>x.EnumType() == "Task");
你可以这样做:

var result = Enum.GetValues(typeof(KodEnum)).OfType<KodEnum>()  
                 .Where(x=>x.EnumType() == "Task");

为什么不定义两个枚举?一个用于选项卡或原因,一个用于操作或任务。在本例中,您是对的,但这只是我在项目中的一个小示例,在此枚举中我有60个值,在特定情况下,我不需要所有值。为什么不定义两个枚举?一个用于Tab或Reason,一个用于Action或Task。在本例中,您是对的,但这只是我在项目中的一个小示例,我在这个枚举中有60个值,在特定情况下,我不需要全部。这会导致NullReferenceException,因为您在KodEnum类型上而不是在其成员上调用GetCustomAttributes。这会导致NullReferenceException,因为您在KodEnum类型上而不是在其成员上调用GetCustomAttributes。这会给我枚举的名称,我想要这些值,比如0,1,2等等。你能只用lambda表达式来转换吗?不是所有的from,select,这给了我枚举的名称,我想要值,比如0,1,2等等。这项工作,你能只用lambda表达式来转换它吗?选择,而不是从中选择所有选项