Exemple de code simplifié utilisant la réflexion et les fonctionnalités en C#

黄舟
Libérer: 2017-09-06 13:48:43
original
1828 Les gens l'ont consulté

Supposons qu'il y ait une classe d'étudiant (Étudiant)


    
 
     
      
         
           {  { name = 
         
          Age { ;  
         
          Address { ;
Copier après la connexion

Si vous devez déterminer si certains champs (attributs) are S'il est vide, qu'il soit supérieur à 0, le code suivant sera disponible :


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();
        }
Copier après la connexion

Un tel code n'est pas réutilisable et inefficace.

Nous pouvons utiliser des attributs, une réflexion, puis parcourir les propriétés et vérifier les attributs.

Personnalisez d'abord une classe d'attributs [obligatoire], héritée d'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;
        }
    }
Copier après la connexion

, puis utilisez cet attribut personnalisé pour marquer les membres de la classe d'élèves Attributs :


/// <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;
    }
Copier après la connexion

Vérifier les attributs d'une classe via les attributs :


  /// <summary>
        /// 检查方法,支持泛型        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="instance"></param>
        /// <returns></returns>
        public static string CheckRequire<T>(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();
        }
Copier après la connexion

Effectuer la validation :


static void Main(string[] args)
        {            var obj = new Student()
            {
                Name = ""
            };
            Console.WriteLine(CheckRequire(obj));
            Console.Read();
        }
Copier après la connexion

Résultat :

Quelqu'un découvrira que le sexe est également marqué de [Require(true)] , pourquoi Il n'y a aucune information de vérification. C'est parce que Sex n'implémente pas les propriétés {get; set; et GetProperties ne peut pas être obtenu

.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal