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

我想返回具有特定属性的枚举成员的列表。因此对于代码示例,我想要一个包含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进行过滤,然后从字段名称中解析结果。

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();

更新资料

虽然您的问题尚不清楚,是否需要进一步按Name进行过滤,但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")))

当回复有时是一个对象有时是一个数组时,如何在使用改造时解析JSON回复? - java

我正在使用Retrofit来获取JSON答复。这是我实施的一部分-@GET("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…

如何在ASP.NET Page_Load事件中识别RadButton启动回发的原因? - c#

在我的ASP.NET页的Page_Load中,我试图确定某个按钮是否已单击并尝试回发:if (Page.IsPostBack) { if (Request.Params.Get("__EVENTARGUMENT") == "doStuff") doSomething(); } doStuff是标记内的JavaScrip…

java.net.URI.create异常 - java

java.net.URI.create("http://adserver.adtech.de/adlink|3.0") 抛出java.net.URISyntaxException: Illegal character in path at index 32: http://adserver.adtech.de/adlink|3.0 虽然n…

如何从JSON文件反序列化.NET Core中封装的对象表? - c#

我想从外部API检索足球联赛的集合。来自服务器的响应如下所示:{ "api": { "results": 1496, "leagues": [ { "league_id": 1, ..... 返回的对象由“ api”字段组成,其中包含“结果”和“联盟”。我想反序列化代码并将其映射…

调整窗口大小时如何调整YouTube播放器的大小 - php

我想显示包含YouTube视频的弹出窗口。我的问题是当用户调整弹出窗口的大小时如何调整YouTube播放器的大小?弹出窗口的头部分PHP / HTML代码<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/…