• 反射与特性


    示例代码

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Reflection;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace MyAttribute.Extension
    {
        /// <summary>
        /// 用户状态
        /// </summary>
        public enum UserState
        {
            /// <summary>
            /// 正常
            /// </summary>
            [Remark("正常")]
            Normal = 0,//左边是字段名称  右边是数据库值   哪里放描述?  注释
            /// <summary>
            /// 冻结
            /// </summary>
            [Remark("冻结")]
            Frozen = 1,
            /// <summary>
            /// 删除
            /// </summary>
            //[Remark("删除")]
            Deleted = 2
        }
        //枚举项加一个描述   实体类的属性也可以Display  
        //别名   映射  
        public class RemarkAttribute : Attribute
        {
            public RemarkAttribute(string remark)
            {
                this._Remark = remark;
            }
            private string _Remark = null;
            public string GetRemark()
            {
                return this._Remark;
            }
        }
    
    
        public static class RemarkExtension
        {
            public static string GetRemark(this Enum value)
            {
                Type type = value.GetType();
                FieldInfo field = type.GetField(value.ToString());
                if (field.IsDefined(typeof(RemarkAttribute), true))
                {
                    RemarkAttribute attribute = (RemarkAttribute)field.GetCustomAttribute(typeof(RemarkAttribute), true);
                    return attribute.GetRemark();
                }
                else
                {
                    return value.ToString();
                }
            }
    
        }
    }
    using MyAttribute.Extension;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace MyAttribute
    {
        /// <summary>
        /// 这里是注释,除了让人看懂这里写的是什么,
        /// 对运行没有任何影响
        /// </summary>
        //[Obsolete("请不要使用这个了,请使用什么来代替", true)]//影响编译器的运行
        //[Serializable]//可以序列化和反序列化  可以影响程序的运行
        //MVC filter   ORM table  key  display   wcf 
    
        //[Custom]
        //[Custom()]
        //[Custom(123), Custom(123, Description = "1234")]
        [Custom(123, Description = "1234", Remark = "2345")]//方法不行
        public class Student
        {
            [CustomAttribute]
            public int Id { get; set; }
            [Leng(5,10)]//还有各种检查
            public string Name { get; set; }
            [Leng(20, 50)]
            public string Accont { get; set; }
    
            /// <summary>
            /// 10001~999999999999
            /// </summary>
            [Long(10001, 999999999999)]
            public long QQ { get; set; }
    
    
            //private long _QQ2 = 0;//解决数据合法性,给属性增加了太多的事儿
            //public long QQ2
            //{
            //    get
            //    {
            //        return this._QQ2;
            //    }
            //    set
            //    {
            //        if (value > 10001 && value < 999999999999)
            //        {
            //            _QQ2 = value;
            //        }
            //        else
            //        {
            //            throw new Exception();
            //        }
            //    }
            //}
            [CustomAttribute]
            public void Study()
            {
                Console.WriteLine($"这里是{this.Name}");
            }
    
            [Custom()]
            [return: Custom()]
            public string Answer([Custom]string name)
            {
                return $"This is {name}";
            }
        }
    }
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Reflection;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace MyAttribute.Extension
    {
        public static class ValidateExtension
        {
            public static bool Validate(this object oObject)
            {
                Type type = oObject.GetType();
                foreach (var prop in type.GetProperties())
                {
                    if (prop.IsDefined(typeof(AbstractValidateAttribute), true))
                    {
                        object[] attributeArray = prop.GetCustomAttributes(typeof(AbstractValidateAttribute), true);
                        foreach (AbstractValidateAttribute attribute in attributeArray)
                        {
                            if (!attribute.Validate(prop.GetValue(oObject)))
                            {
                                return false;//表示终止
                            }
                        }
                    }
    
                    //if (prop.IsDefined(typeof(LongAttribute), true))
                    //{
                    //    LongAttribute attribute = (LongAttribute)prop.GetCustomAttribute(typeof(LongAttribute), true);
                    //    if (!attribute.Validate(prop.GetValue(oObject)))
                    //    {
                    //        return false;
                    //    }
                    //}
                    //if (prop.IsDefined(typeof(LengAttribute), true))
                    //{
                    //    LengAttribute attribute = (LengAttribute)prop.GetCustomAttribute(typeof(LengAttribute), true);
                    //    if (!attribute.Validate(prop.GetValue(oObject)))
                    //    {
                    //        return false;
                    //    }
                    //}
                }
                return true;
            }
        }
    
        public abstract class AbstractValidateAttribute : Attribute
        {
            public abstract bool Validate(object value);
        }
    
        [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
        public class LengAttribute : AbstractValidateAttribute
        {
            private int _Min = 0;
            private int _Max = 0;
            public LengAttribute(int min, int max)
            {
                this._Min = min;
                this._Max = max;
            }
    
    
            public override bool Validate(object value)//" "
            {
                if (value != null && !string.IsNullOrWhiteSpace(value.ToString()))
                {
                    int length = value.ToString().Length;
                    if (length > this._Min && length < this._Max)
                    {
                        return true;
                    }
                }
                return false;
            }
        }
        public class LongAttribute : AbstractValidateAttribute
        {
            private long _Min = 0;
            private long _Max = 0;
            public LongAttribute(long min, long max)
            {
                this._Min = min;
                this._Max = max;
            }
    
    
            public override bool Validate(object value)//" "
            {
                //可以改成一句话
                if (value != null && !string.IsNullOrWhiteSpace(value.ToString()))
                {
                    if (long.TryParse(value.ToString(), out long lResult))
                    {
                        if (lResult > this._Min && lResult < this._Max)
                        {
                            return true;
                        }
                    }
                }
                return false;
            }
        }
    }
  • 相关阅读:
    用mstsc連接服務器收到超出最大連接數的問題
    DIV+CSS自適就高度解決方案
    与佛关于婚外情的经典对白[轉]
    [轉]修改计算机名,sharepoint站点打不开了
    今天測試服務器壞了
    Microsoft.Jet.Oledb.4.0 找不到提供者或未安裝問題
    今天開始學習silverlight了
    FreeTextBox運行錯誤解決
    使用AJAXControlToolkit出現的問題
    子类如何调用被子类override了的方法?
  • 原文地址:https://www.cnblogs.com/cxxtreasure/p/13258108.html
Copyright © 2020-2023  润新知