作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想返回具有特定属性的枚举成员列表。因此,对于代码示例,我想要一个包含枚举 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/
我是一名优秀的程序员,十分优秀!