ホームページ バックエンド開発 C#.Net チュートリアル C# のリフレクションと機能を使用した簡略化されたコード例

C# のリフレクションと機能を使用した簡略化されたコード例

Sep 06, 2017 pm 01:48 PM
.net 簡略化する

今、学生クラス (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 までご連絡ください。

ホット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ヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

いくつかの .NET オープンソース AI および LLM 関連プロジェクト フレームワークを共有する いくつかの .NET オープンソース AI および LLM 関連プロジェクト フレームワークを共有する May 06, 2024 pm 04:43 PM

現在、人工知能(AI)技術の開発は本格化しており、さまざまな分野で大きな可能性と影響力を発揮しています。本日、Dayao は、参考にしていただけるよう、4 つの .NET オープン ソース AI モデル LLM 関連プロジェクト フレームワークを共有します。 https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.mdSemanticKernelSemanticKernel は、OpenAI、Azure などの大規模言語モデル (LLM) を統合するように設計されたオープン ソース ソフトウェア開発キット (SDK) です。

C# の雇用の見通しはどのようなものですか? C# の雇用の見通しはどのようなものですか? Oct 19, 2023 am 11:02 AM

初心者でも経験豊富なプロフェッショナルでも、C# をマスターすることでキャリアへの道が開かれます。

numpy を list に変換: データ処理プロセスを簡素化する効果的な戦略 numpy を list に変換: データ処理プロセスを簡素化する効果的な戦略 Jan 19, 2024 am 10:47 AM

NumPy は、データ処理および機械学習アプリケーションで非常に便利で広く使用されているライブラリです。 NumPy の重要な特徴は、Python で配列と行列の数学的演算を行うためのツール関数を多数提供していることです。そのため、NumPy は科学技術コンピューティングの分野で重要なツールとなっています。ただし、多くの場合、コードでより適切に使用するには、NumPy 配列を Python リスト (または他の同様のデータ型) に変換する必要があります。 NumPy 配列は多くの点で P よりも優れていますが、

Java フレームワークと .NET フレームワークのパフォーマンスの違い Java フレームワークと .NET フレームワークのパフォーマンスの違い Jun 03, 2024 am 09:19 AM

同時実行性の高いリクエスト処理の点では、.NETASP.NETCoreWebAPI は JavaSpringMVC よりも優れたパフォーマンスを発揮します。その理由としては、AOT の早期コンパイルにより起動時間が短縮され、開発者がオブジェクト メモリの割り当てと解放を行うため、より洗練されたメモリ管理が行われます。

開発者向けの .NET パフォーマンス最適化テクノロジ 開発者向けの .NET パフォーマンス最適化テクノロジ Sep 12, 2023 am 10:43 AM

.NET 開発者は、高品質のソフトウェアを提供するために機能とパフォーマンスを最適化することの重要性を認識する必要があります。提供されたリソースを巧みに活用し、Web サイトの読み込み時間を短縮することで、ユーザーに快適なエクスペリエンスを提供するだけでなく、インフラストラクチャのコストも削減できます。

PHP アロー関数: ループ処理を簡素化する方法 PHP アロー関数: ループ処理を簡素化する方法 Sep 13, 2023 am 08:15 AM

PHP アロー関数: ループ処理を簡素化する方法、具体的なコード例が必要 はじめに: PHP7.4 のリリースにより、アロー関数は PHP の非常に興味深い新機能になりました。アロー関数の登場により、ループを扱う際がより簡潔で便利になります。この記事では、アロー関数の基本構文とアロー関数を使用してループ処理を簡素化する方法を紹介し、具体的なコード例を示します。アロー関数の基本構文 アロー関数の構文は非常に単純で、無名関数を記述する簡単な方法とみなすことができます。その文法構造

PHP7のNull Coalesce演算子:コードの条件判定を簡素化するには? PHP7のNull Coalesce演算子:コードの条件判定を簡素化するには? Oct 20, 2023 am 09:18 AM

PHP7のNullCoalesce演算子:コードの条件判定を簡素化するには?開発プロセスでは、変数に値があるかどうか、または null であるかどうかを判断するために、変数に対して条件判定を実行する必要があることがよくあります。従来の方法は if 文や三項演算子を使用して条件判定を行うことですが、この書き方は場合によっては長く複雑に見えることがあります。幸いなことに、NullCoalesce 演算子 (??) が PHP7 で導入されました。これは、コードの記述方法を簡素化し、開発効率を向上させるのに役立ちます。 N

サードパーティのライブラリを使用して Java 関数の開発を簡素化する方法 サードパーティのライブラリを使用して Java 関数の開発を簡素化する方法 Aug 05, 2023 pm 07:49 PM

サードパーティ ライブラリを使用して Java 関数開発を簡素化する方法 はじめに: Java は広く使用されているプログラミング言語として、豊富な関数とライブラリを備えており、これらのライブラリは開発者にとって貴重なリソースであり、アプリケーションをより効率的に開発するのに役立ちます。このうち、サードパーティ ライブラリとは、サードパーティ開発者によって作成され、開発者が使用できるライブラリを指します。この記事では、サードパーティのライブラリを使用して Java 関数の開発を簡素化する方法を紹介し、コード例で説明します。 1. ニーズを理解する サードパーティ ライブラリの使用を開始する前に、まず独自の開発ニーズを理解する必要があります。

See all articles