検索
ホームページバックエンド開発C#.Net チュートリアル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 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();
        }

検証の実行:


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

結果出力:

性別も[Require(true)]とマークされていることに気づく人もいますが、なぜ検証情報がないのかというと、 Sex は属性 { set } を実装していません。GetProperties を取得できません。

以上がC# のリフレクションと機能を使用した簡略化されたコード例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
C#的就业前景如何C#的就业前景如何Oct 19, 2023 am 11:02 AM

无论您是初学者还是有经验的专业人士,掌握C#将为您的职业发展铺平道路。

分享几个.NET开源的AI和LLM相关项目框架分享几个.NET开源的AI和LLM相关项目框架May 06, 2024 pm 04:43 PM

当今人工智能(AI)技术的发展如火如荼,它们在各个领域都展现出了巨大的潜力和影响力。今天大姚给大家分享4个.NET开源的AI模型LLM相关的项目框架,希望能为大家提供一些参考。https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.mdSemanticKernelSemanticKernel是一种开源的软件开发工具包(SDK),旨在将大型语言模型(LLM)如OpenAI、Azure

Java框架和.NET框架的性能差异Java框架和.NET框架的性能差异Jun 03, 2024 am 09:19 AM

在高并发请求处理方面,.NETASP.NETCoreWebAPI性能优于JavaSpringMVC,原因包括:AOT提前编译,减少启动时间;更精细的内存管理,由开发人员负责分配和释放对象内存。

numpy转list:简化数据处理流程的有效策略numpy转list:简化数据处理流程的有效策略Jan 19, 2024 am 10:47 AM

在数据处理和机器学习的应用中,NumPy是一个十分有用且广泛使用的库。NumPy的一个重要特点是在Python中提供了大量针对数组和矩阵进行数学运算的工具函数,这使得NumPy成为了科学计算领域的重要工具。然而,在许多情况下,我们需要将NumPy数组转换为Python列表(或其它类似数据类型),以便更好地在我们的代码中使用。虽然NumPy数组在许多方面都比P

面向开发人员的.NET性能优化技术面向开发人员的.NET性能优化技术Sep 12, 2023 am 10:43 AM

如果你是一名.NET开发者,你必须意识到在交付高质量软件方面,优化功能和性能的重要性。通过熟练使用提供的资源并减少网站加载时间,你不仅为用户创造了愉快的体验,还能减少基础设施成本。

PHP7中的Null Coalesce运算符:如何简化代码的条件判断?PHP7中的Null Coalesce运算符:如何简化代码的条件判断?Oct 20, 2023 am 09:18 AM

PHP7中的NullCoalesce运算符:如何简化代码的条件判断?在开发过程中,我们经常需要对变量进行条件判断,以确定是否有值或者是否为null。传统的方式是通过使用if语句或三元运算符来进行条件判断,但这样的写法在一些情况下显得冗长且复杂。幸运的是,在PHP7中引入了NullCoalesce运算符(??),可以帮助我们简化代码的写法并提高开发效率。N

PHP 箭头函数:如何简化循环处理PHP 箭头函数:如何简化循环处理Sep 13, 2023 am 08:15 AM

PHP箭头函数:如何简化循环处理,需要具体代码示例引言:随着PHP7.4版本的发布,箭头函数成为了PHP中一个很有趣的新特性。箭头函数的出现让我们在处理循环时变得更加简洁和方便。本文将介绍箭头函数的基本语法和如何利用箭头函数简化循环处理的操作,并给出具体的代码示例。箭头函数的基本语法箭头函数的语法非常简单,可以将其视为匿名函数的一种快捷写法。它的语法结构

如何利用第三方库简化Java功能开发如何利用第三方库简化Java功能开发Aug 05, 2023 pm 07:49 PM

如何利用第三方库简化Java功能开发引言:Java作为一种广泛使用的编程语言,有着丰富的功能和库,这些库是开发者们的宝贵资源,可以帮助他们更高效地开发应用程序。其中,第三方库是指由第三方开发者编写的,可供开发者使用的库。本文将介绍如何利用第三方库来简化Java功能的开发,并通过代码示例来加以说明。一、了解需求在开始使用第三方库之前,首先需要清楚自己的开发需求

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。