(精华)2020年8月9日 C#基础知识点 特性

(精华)2020年8月9日 C#基础知识点 特性

一:基本使用执行特性中的方法

//----------------基本使用执行特性中的方法--------------------
Student student = new Student();
Student studentVip = new StudentVip()
{<!-- -->
  Id = 1,
  Name = "热爱学习",
  VipGroup = ".Net vip"
};
InvokeCenter.ManagerSudent<Student>(studentVip);
/// <summary> 
    /// 请不要使用这个了,请使用什么来代替  
    /// </summary>
    //[Obsolete("请不要使用这个了,请使用什么来代替")]//系统
    //[Serializable]//可以序列化和反序列化  
    [Cutom(234, "辣辣零")]
    [Cutom(123)]
    [Cutom(567, Remark = ".Net VIP", Description = ".Net VIP")]
    [CutomAttributeChild]
    public class Student
    {<!-- -->
        public int Id {<!-- --> get; set; }
        public string Name {<!-- --> get; set; }

        public void Study()
        {<!-- -->
            Console.WriteLine($"这里是{this.Name}");
        }

        public string Answer(string name)
        {<!-- -->
            return $"This is {name}";
        }
    }
[Cutom(123, Remark = ".Net vip", Description = "vip 正在学习")]
    public class StudentVip : Student
    {<!-- -->
        [Cutom(123, Remark = ".Vip", Description = ".Net vip")]
        public string VipGroup {<!-- --> get; set; }

        [Cutom(123, Remark = ".Vip", Description = ".Net vip")]
        public void Homework()
        {<!-- -->
            Console.WriteLine("Homework");
        }

        [SalaryAttribute(1000000)]
        public long Salary {<!-- --> get; set; }
    }
public class InvokeCenter
    {<!-- -->
        public static void ManagerSudent<T>(T student) where T : Student
        {<!-- -->
            Console.WriteLine(student.Id);
            Console.WriteLine(student.Name);
            student.Answer("YZM");
            Type type = student.GetType();
            if (type.IsDefined(typeof(CutomAttribute), true)) // 先判断
            {<!-- -->
                object[] aAttributeArry = type.GetCustomAttributes(typeof(CutomAttribute), true);
                foreach (CutomAttribute attribute in aAttributeArry)
                {<!-- -->
                    attribute.Show();
                }

                foreach (var prop in type.GetProperties())
                {<!-- -->
                    if (prop.IsDefined(typeof(CutomAttribute), true)) // 先判断
                    {<!-- -->
                        object[] aAttributeArryprop = prop.GetCustomAttributes(typeof(CutomAttribute), true);
                        foreach (CutomAttribute attribute in aAttributeArryprop)
                        {<!-- -->
                            attribute.Show();
                        }
                    } 
                } 
                foreach (var method in type.GetMethods())
                {<!-- -->
                    if (method.IsDefined(typeof(CutomAttribute), true)) // 先判断
                    {<!-- -->
                        object[] aAttributeArryMethod = method.GetCustomAttributes(typeof(CutomAttribute), true);
                        foreach (CutomAttribute attribute in aAttributeArryMethod)
                        {<!-- -->
                            attribute.Show();
                        }
                    }
                }
            }
        }
    }
[AttributeUsage(AttributeTargets.All, AllowMultiple = true)]
    public class CutomAttribute : Attribute
    {<!-- -->
        public CutomAttribute()
        {<!-- -->
            Console.WriteLine("无参数构造函数");
        }
        public CutomAttribute(int i)
        {<!-- -->
            Console.WriteLine("Int类型构造函数");
        }

        public CutomAttribute(int i, string j)
        {<!-- -->
            Console.WriteLine("两个参数构造函数");
        }
        public string Remark {<!-- --> get; set; }

        public string Description;

        public void Show()
        {<!-- -->
            Console.WriteLine("通过反射调用特性中的方法");
        }
    }

    public class CutomAttributeChild : CutomAttribute
    {<!-- -->
        public CutomAttributeChild() : base(345)
        {<!-- -->
        }
    }

二:获取枚举中特性说明

//----------------特性获取额外的信息--------------------
string remark1 = AttributeExtend.GetRemark(UserState.Normal);
string remark2 = AttributeExtend.GetRemark(UserState.Frozen);
string remark3 = UserState.Deleted.GetRemark(); //扩展方法
public static class AttributeExtend
    {<!-- -->
        public static string GetRemark(this Enum value)
        {<!-- -->
            Type type = value.GetType();
            var field = type.GetField(value.ToString());
            if (field.IsDefined(typeof(RemarkAttribute), true))
            {<!-- -->
                RemarkAttribute attribute = (RemarkAttribute)field.GetCustomAttribute(typeof(RemarkAttribute), true);
                return attribute.Remark;
            }
            else
            {<!-- -->
                return value.ToString();
            }
        }
    }
public enum UserState
    {<!-- -->
        /// <summary>
        /// 正常状态
        /// </summary>
        [RemarkAttribute("正常状态")]
        Normal = 0,

        /// <summary>
        /// 已冻结
        /// </summary>
        [RemarkAttribute("已冻结")] 
        Frozen = 1,

        /// <summary>
        /// 已删除
        /// </summary>
        [RemarkAttribute("已删除")]
        Deleted = 2
    }

三:特性如何增加额外方法

 bool flg = AttributeExtend.Validate(student);
public class AttributeExtend
    {<!-- -->
        public static bool Validate(StudentVip student)
        {<!-- -->
            Type type = student.GetType();

            foreach (var prop in type.GetProperties())
            {<!-- -->
                if (prop.IsDefined(typeof(SalaryAttribute), true)) // 这里先判断  是为了提高性能
                {<!-- -->
                    object ovale = prop.GetValue(student);
                    foreach (SalaryAttribute attribute in prop.GetCustomAttributes(typeof(SalaryAttribute), true)) // 获取特性的实例  上面先判断之后,再获取实例
                    {<!-- -->
                        return attribute.Validate(ovale);
                    }
                }
            }
            return false;
        }
    }
[AttributeUsage(AttributeTargets.Property)]
    public class SalaryAttribute : AbstratValidateAttribute
    {<!-- -->
        public long _Salary {<!-- --> get; set; }  // 公司的预算 800000

        public SalaryAttribute(long salary)
        {<!-- -->
            _Salary = salary;
        }

        public override bool Validate(object oValue)
        {<!-- -->
            return oValue != null && long.TryParse(oValue.ToString(), out long lValue) && lValue < _Salary;
        }

    }
posted @ 2020-12-30 11:43  不要摸我的腰  阅读(67)  评论(0编辑  收藏  举报