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

: これが機能するのは、enum 値 (例: ) が実際には内部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 に答える