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表达式来转换它吗?选择,而不是从中选择所有选项