我想返回具有特定属性的枚举成员的列表。因此对于代码示例,我想要一个包含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异常 - javajava.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/…