1

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

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
    }

将标记有我的自定义属性的成员值放入列表的最佳方法是什么?

4

1 回答 1

2

试试这个

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();
于 2013-03-21T06:36:43.260 回答