C#汇总-特性

版权声明:未经本人允许,必须声明原文转载地址和作者! https://blog.csdn.net/liuchang19950703/article/details/87869036

一:C#【特性】的基本概念和调用特性

二:C#【特性】运用1-枚举解释

三:C#【特性】运用2-属性验证

1:调用类运行代码

  public class Program
    {
        public static void Main(string[] args)
        {
            
            #region 特性
            #region 特性调用-类,方法
            //特性就是对类,方法,属性等的补充
            AttribuDemo attDemo = new AttribuDemo { DId = 1001, DName = "MIke" };
            //1.修饰【类】时获取特性类
            new AttribuHelper().ShowAttributeByClass();
            //2.修饰【方法】时获取特性类
            new AttribuHelper().ShowAttributeByMethod();
            attDemo.DShow();
            Console.ReadKey();
            #endregion

            #region 特性运用1-枚举解释
            Enum em = EnumDemo.SoSo;
            string name = EnumClass.GetName(em);
            Console.WriteLine(name);
            Console.ReadKey();
            #endregion

            #region 特性运用2-属性验证
            PropDemo prop = new PropDemo();
            prop.ID = 1;
            prop.QQ = 10;
            bool result = AttribuProp.ValidaProp(prop);
            Console.WriteLine($"{(result ? "成功" : "失败")}");
            Console.ReadKey();
            #endregion
            #endregion

        }
    }

2:辅助类代码

(1)枚举解释运用-【AttribuEnum】类:

 public class AttribuEnum : Attribute
    {
        public string _name = null;
        public AttribuEnum(string name)
        {
            this._name = name;
        }
    }

(2)枚举解释运用-【EnumDemo】类

public enum EnumDemo
    {
        [AttribuEnum("优秀")]
        Good = 1,
        [AttribuEnum("一般")]
        SoSo = 2,
        [AttribuEnum("差")]
        Bad = 3,
        EnumDemo = 4
    }
    public static class EnumClass
    {
        public static string GetName(this Enum em)
        {
             Type type = em.GetType();
            FieldInfo field = type.GetField(em.ToString());
            if (field.IsDefined(typeof(AttribuEnum), true))
            {
                AttribuEnum attEnum = (AttribuEnum)field.GetCustomAttribute(typeof(AttribuEnum), true);
                return attEnum._name;
            }
            return "";
        }
    }

(1)属性验证运用-【AttribuProp】类:

 public static class AttribuProp
    {
        /// <summary>
        /// 验证该对象是否符合该特性的验证
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public static bool ValidaProp(this object obj)
        {
            Type type = obj.GetType();
            foreach (PropertyInfo prop in type.GetProperties())
            {
                if (prop.IsDefined(typeof(AttribuAbstractProp), true))
                {
                    foreach (var item in prop.GetCustomAttributes(typeof(AttribuAbstractProp), true))
                    {
                        AttribuAbstractProp abstractAttribu = (AttribuAbstractProp)item;
                        if (!abstractAttribu.ValidObj(obj))
                        {
                            return false;
                        }
                    }
                }
            }
            return true;
        }
    }

    /// <summary>
    /// 虚方法特性
    /// </summary>
    [AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = true)]
    public abstract class AttribuAbstractProp : Attribute
    {
        public abstract bool ValidObj(object obj);
    }

    /// <summary>
    /// 验证数值大小的特性
    /// </summary>
    public class AttribuSize : AttribuAbstractProp
    {
        private long _min;
        private long _max;
        public AttribuSize(long min, long max)
        {
            _min = min;
            _max = max;
        }
        public override bool ValidObj(object obj)
        {
            if (!string.IsNullOrWhiteSpace(obj.ToString()))
            {
                if (long.TryParse(obj.ToString(), out long result))
                {
                    if (result >= _min && result <= _max)
                    {
                        return true;
                    }
                }
            }
            return false;
        }
    }

(2)属性验证运用-【PropDemo】类:

  public class PropDemo
    {
        public int ID { get; set; }
        [AttribuSize(9999, 9999999)]
        public long QQ { get; set; }
    }

猜你喜欢

转载自blog.csdn.net/liuchang19950703/article/details/87869036