首页后端开发ASP.NETC#中使用反射以及特性简化的实例代码

C#中使用反射以及特性简化的实例代码

时间2024-01-30 17:27:03发布访客分类ASP.NET浏览871
导读:收集整理的这篇文章主要介绍了C#中使用反射以及特性简化的实例代码,觉得挺不错的,现在分享给大家,也给大家做个参考。假设现在有一个学生类(Student { { nam...
收集整理的这篇文章主要介绍了C#中使用反射以及特性简化的实例代码,觉得挺不错的,现在分享给大家,也给大家做个参考。

假设现在有一个学生类(Student)


                                    {
  {
 name =                    Age {
     ;
                     Address {
     ;
    

如果需要判断某些字段(属性)是否为空,是否大于0,便有以下代码:


public static string Validatestudent(Student student)        {
                StringBuilder validateMessage = new StringBuilder();
                        if (string.IsNullOrEmpty(student.Name))            {
                    validateMessage.ApPEnd("名字不能为空");
            }
            if (string.IsNullOrEmpty(student.Sex))            {
                    validateMessage.Append("性别不能为空");
            }
            if (student.Age = 0)            {
                    validateMessage.Append("年龄必填大于0");
            }
                            //...... 几百行                        // 写到这里发现不对啊,如果必填项有20多个,难道我要一直这样写吗!            return validateMessage.ToString();
        }
    

这样的代码,重用性不高,而且效率低。

我们可以用特性,反射,然后遍历属性并检查特性。

首先自定义一个【必填】特性类,继承自Attribute


    /// summary>
        /// 【必填】特性,继承自Attribute    /// /summary>
    public sealed class RequireAttribute : Attribute    {
            PRivate bool isRequire;
        public bool IsRequire        {
            get {
     return isRequire;
 }
        }
            /// summary>
            /// 构造函数        /// /summary>
            /// param name="isRequire">
    /param>
        public RequireAttribute(bool isRequire)        {
                this.isRequire = isRequire;
        }
    }
    

然后用这个自定义的特性标记学生类的成员属性:


/// summary>
        /// 学生类    /// /summary>
    public class Student    {
               /// summary>
            /// 名字        /// /summary>
            private string name;
        [Require(true)]        public string Name        {
            get {
     return name;
 }
            set {
     name = value;
 }
        }
            /// summary>
            /// 年龄        /// /summary>
        [Require(true)]        public int Age {
     get;
     set;
 }
            /// summary>
            /// 地址        /// /summary>
        [Require(false)]        public string Address {
     get;
     set;
 }
            /// summary>
            /// 性别        /// /summary>
            [Require(true)]         public string Sex;
    }
    

通过特性检查类的属性:


  /// summary>
            /// 检查方法,支持泛型        /// /summary>
            /// typeparam name="T">
    /typeparam>
            /// param name="instance">
    /param>
            /// returns>
    /returns>
            public static string CheckRequireT>
(T instance)        {
                        VAR validateMsg = new StringBuilder();
                        //获取T类的属性            Type t = typeof (T);
                            var propertyInfos = t.GetProperties();
                        //遍历属性            foreach (var propertyInfo in propertyInfos)            {
                                //检查属性是否标记了特性                RequireAttribute attribute = (RequireAttribute) Attribute.GetCustomAttribute(propertyInfo, typeof (RequireAttribute));
                                //没标记,直接跳过                if (attribute == null)                {
                                        continue;
                }
                                    //获取属性的数据类型                var type = propertyInfo.PropertyType.ToString().ToLower();
                                    //获取该属性的值                var value = propertyInfo.GetValue(instance);
                                if (type.Contains("System.string"))                {
                                        if (string.IsNullOrEmpty((string) value) &
    &
     attribute.IsRequire)                        validateMsg.Append(propertyInfo.Name).Append("不能为空").Append(",");
                }
                                else if (type.Contains("system.int"))                {
                                        if ((int) value == 0 &
    &
     attribute.IsRequire)                        validateMsg.Append(propertyInfo.Name).Append("必须大于0").Append(",");
                }
            }
                return validateMsg.ToString();
        }
    

执行验证:


static void Main(string[] args)        {
            var obj = new Student()            {
                Name = ""            }
    ;
                Console.WrITeLine(CheckRequire(obj));
                Console.Read();
        }

结果输出:

有人会发现,Sex也标记了[Require(true)],为什么没有验证信息,这是因为,Sex没有实现属性{ get; set; } ,GetProperties是获取不到的

以上就是C#中使用反射以及特性简化的实例代码的详细内容,更多请关注其它相关文章!

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

.netcsharp

若转载请注明出处: C#中使用反射以及特性简化的实例代码
本文地址: https://pptw.com/jishu/592819.html
nodejs用什么调试工具 C#/.NET易错的几点

游客 回复需填写必要信息