gpt4 book ai didi

c# - 如何获取已用特定属性修饰的枚举成员列表

转载 作者:行者123 更新时间:2023-12-03 05:11:25 25 4
gpt4 key购买 nike

我想返回具有特定属性的枚举成员列表。因此,对于代码示例,我想要一个包含枚举 SecondValue 和 ThirdValue 的列表,但不包含 FirstValue 或 FourthValue,因为它没有属性 Container。

我怎样才能做到这一点?

PS:这之前已被标记为重复,并带有指向此的链接: Getting attributes of Enum's value

这不是同一个问题。我制作了更多示例代码以使我的问题更清楚。查看函数定义及其应返回的内容。

    [AttributeUsage(AttributeTargets.Field)]
public sealed class ContainerAttribute : Attribute
{
public string Name { get; }

public ContainerAttribute(string name)
{
Name = name;
}
}

public enum MyEnum
{
[SomeOtherAttribute("attr")]
FirstValue,

[Container("name1")]
SecondValue,

[Container("name1")]
ThirdValue,

FourthValue
}

public List<MyEnum> GetEnumsWithAttribute(Attribute value) { }

public void Main(String[] args) {
// someEnums should return list with content: [MyEnum.SecondValue, MyEnum.ThirdValue];
var someEnums = GetEnumsWithAttribute(ContainerAttribute);
}

最佳答案

任何时候你使用属性,你都必须使用反射。混合一些 Linq,您可以检查枚举的字段以按属性类型进行过滤,然后从字段名称解析结果。

Type ta = typeof(ContainerAttribute);
Type t = typeof(MyEnum);

var result = t.GetFields()
.Where(a => a.CustomAttributes.Any(c => c.AttributeType == ta))
.Select(a => (MyEnum)Enum.Parse(t, a.Name))
.ToList();

Update

虽然您的问题并不清楚您是否需要按名称进一步过滤,但 Guru 的回答暗示您可能会这样做,或者将来会这样做。如果是这样,您可以通过更改 Where 子句来编辑我的解决方案,以接受您想要的 Name 字符串:

// method would take a string argument rather than hard-coding "name1"
.Where(a => a.CustomAttributes.Any(c => c.AttributeType == ta && c.ConstructorArguments.Any(ca => ca.Value.ToString() == "name1")))

关于c# - 如何获取已用特定属性修饰的枚举成员列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61573709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com