如何使用c#返回带有自定义属性标记的枚举值

本文关键字:枚举 自定义属性 何使用 返回 | 更新日期: 2023-09-27 18:04:55

我有一个枚举,其中一些成员由自定义属性标记,如:

public enum VideoClipTypeEnum : int
{
    Exhibitions = 1,
    TV = 2,
    [ClipTypeDisplayAttribute(false)]
    Content = 3
}

我的属性是:

public class ClipTypeDisplayAttribute : DescriptionAttribute
    {
        #region Private Variables
        private bool _treatAsPublicType;
        #endregion
        #region Ctor
        public ClipTypeDisplayAttribute(bool treatAsPublicType)
        {
            _treatAsPublicType = treatAsPublicType;
        }
        #endregion
        #region Public Props
        public bool TreatAsPublicType
        {
            get
            {
                return _treatAsPublicType;
            }
            set
            {
                _treatAsPublicType = value;
            }
        }
        #endregion
    }

获得用我的自定义属性标记的成员值的最好方法是什么?

如何使用c#返回带有自定义属性标记的枚举值

试试这个

var values = 
    from f in typeof(VideoClipTypeEnum).GetFields()
    let attr = f.GetCustomAttributes(typeof(ClipTypeDisplayAttribute))
                .Cast<ClipTypeDisplayAttribute>()
                .FirstOrDefault()
    where attr != null
    select f;

这实际上将返回枚举值的FieldInfo。要获取原始值,请尝试以下操作:

var values = 
    ... // same as above
    select (VideoClipTypeEnum)f.GetValue(null);

如果您还想通过属性的某些属性进行过滤,您也可以这样做。这样的

var values = 
    ... // same as above
    where attr != null && attr.TreatAsPublicType
    ... // same as above

注意:这可以工作,因为枚举值(例如VideoClipTypeEnum.TV)实际上是作为VideoClipTypeEnum内部的静态常量字段实现的。

使用

获取List<int>
var values = 
    (from f in typeof(VideoClipTypeEnum).GetFields()
     let attr = f.GetCustomAttributes(typeof(ClipTypeDisplayAttribute))
                 .Cast<ClipTypeDisplayAttribute>()
                 .FirstOrDefault()
     where attr != null
     select (int)f.GetValue(null))
    .ToList();