Для этого можно использовать отражение :
public static List<MyEnum> GetEnumsWithAttribute(Attribute value)
{
return typeof(MyEnum)
.GetMembers()
.Where(m => m.MemberType == MemberTypes.Field)
.Where(m => m.GetCustomAttributes().Any(a => a.Equals(value)))
.Select(m => Enum.Parse<MyEnum>(m.Name))
.ToList();
}
Эта реализация опирается на .Equals
, перегруженную в ContainerAttribute
, например:
public override bool Equals(object? obj)
{
var other = obj as ContainerAttribute;
if (other == null) return false;
return this.Name == other.Name;
}
Если вы не хотите переопределять Equals
, вы можете изменить свой метод на общий c:
public static List<MyEnum> GetEnumsWithAttribute<T>(T value, Func<T, T , bool> comparerFunc) where T: Attribute
{
return typeof(MyEnum)
.GetMembers()
.Where(m => m.MemberType == MemberTypes.Field)
.Where(m => m.GetCustomAttributes().Any(a => a is T && comparerFunc((T)a, value)))
.Select(m => Enum.Parse<MyEnum>(m.Name))
.ToList();
}
И использование:
var someEnums = GetEnumsWithAttribute(new ContainerAttribute("name1"), (a1, a2) => a1.Name == a2.Name);