反射技術


反射とは
反射とは、運転中にオブジェクト情報を動的に取得する方法です。例えば、実行時に獲得したオブジェクトの属性、方法、依頼などがありますか?
反射の役割
運転が可能な場合は、オブジェクトを動的に呼び出す方法や、属性値の動的設定、取得などが可能です。
反射の例:
using System; 
using System.Reflection; 
  
namespace CS_Test 
{ 
    public class MyStudent 
    { 
        private string sName; 
        public string SName 
        { 
            get { return sName; } 
            set { sName = value; } 
        } 
  
        private int sAge; 
        public int SAge 
        { 
            get { return sAge; } 
            set { sAge = value; } 
        } 
    } 
  
    class Test_Attribute 
    { 
        [STAThread] 
        static void Main(string[] args) 
        { 
            MyStudent stu1 = new MyStudent(); 
            stu1.SName = "   "; 
            stu1.SAge = 40; 
             
            //        
            PropertyInfo[] pros = stu1.GetType().GetProperties(); 
            //         
            foreach (PropertyInfo pro in pros) 
              Console.WriteLine(pro.Name+":"+pro.GetValue(stu1,null)); 
  
            //  stu1   SAge  
            stu1.GetType().GetProperty("SAge").SetValue(stu1, 30, null); 
  
            //         
            foreach (PropertyInfo pro in pros) 
              Console.WriteLine(pro.Name+":"+pro.GetValue(stu1, null)); 
        } 
    } 
} 
 
(二)特性について
アトリブトとは何ですか?実行時のオブジェクトやオブジェクトの属性、方法、依頼などを説明するクラスです。
アトリエの役割?実行時に、あなたのコードを説明したり、あなたのプログラムに影響を与える行為を行います。
注意:
Attributeがクラスである以上、その定義は定義類と同じです。
唯一の違いは、カスタマイズクラスはSystem.Attributeの空間に引き継がなければなりません。
特性の例:
 //         Attribute 
    public class DataFieldAttribute : Attribute 
    { 
        public DataFieldAttribute(string fieldName,string fieldType) 
        { 
            this._fieldName = fieldName; 
            this._fieldType = fieldType; 
        } 
  
        //        
        private string _fieldName; 
        public string FieldName 
        { 
            get { return _fieldName; } 
            set { _fieldName = value; } 
        } 
  
        //         
        private string _fieldType; 
        public string FieldType 
        { 
            get { return _fieldType; } 
            set { _fieldType = value; } 
        } 
    } 
 
カスタムAttributeを通じて、クラスの属性とデータベースフィールドの対応関係を定義し、MyStudent類のName、Age属性にはAttributeの記述を加えて、彼らに対応するデータベースフィールド名とタイプを指定します。
コードの変更は以下の通りです。
  public class MyStudent 
    { 
        private string _name; 
  
        //  “  ”           、   
        [DataFieldAttribute("SName", "varchar")] 
        public string Name 
        { 
            get { return _name; } 
            set { _name = value; } 
        } 
  
        private int _age; 
  
        [DataFieldAttribute("SAge", "int")] 
        public int Age 
        { 
            get { return _age; } 
            set { _age = value; } 
        } 
    } 
 
(三)ORMマッピング規則の定義
エンティティクラスにData FieldAttributeの記述を追加すると、O(オブジェクト)/R(関係データベース)のマッピングルールが追加されます。
次に反射法により、運転時にO/Rを動的に取得します。  Mappingのマッピングルール:
static void Main(string[] args) 
{ 
    MyStudent stu1 = new MyStudent(); 
    stu1.Name = "   "; 
    stu1.Age = 40; 
    //                  
  
    PropertyInfo[] infos = stu1.GetType().GetProperties(); 
    object[] objs_fieldAttr = null; 
    foreach (PropertyInfo info in infos) 
    { 
        // GetCustomAttributes:  
        //               “  ”  (      、  ) 
        objs_fieldAttr = info.GetCustomAttributes( 
                              typeof(DataFieldAttribute), false); 
        if (objs_fieldAttr != null) 
        { 
            Console.Write("       :" + info.Name); 
            Console.Write(" ->       :"); 
            Console.WriteLine(((DataFieldAttribute)objs_fieldAttr[0]).FieldName); 
        } 
    } 
} 
 
結果を表示:
エンティティクラスの属性名:Name->データベースフィールド名:SNAMeエンティティ類の属性名:Age->データベースフィールド名:SAge
 
 
次の仕事は、この方法によってオブジェクトからマッピングルールを動的に取得し、Insert、Update、DeleteなどのSQL文を動的に構成することです。これは自分のORMを実現する原理です。
 
 
ここのコードは単なる例ですが、実際にORMを実現するには、多くのことを考慮する必要があります。例えば、1、エンティティ類はどのデータベーステーブルに対応していますか?2、データベーステーブルのPK  FKとはどういう意味ですか?…
 
学習ソース: