C# -- リフレクションは Start!-Get オブジェクトのフィールド/プロパティ/メソッド/メンバー/構築メソッドを使用します

なぜ送信を使用する必要があるのでしょうか? ##1. この成り立つその他のプロパティ情報を取得して使用します




たとえば、エクスポート テーブルを作成したいのですが、対応するエンティティ クラス モデルで列名を定義したいので、1 対 1 の対応があり、コードの煩わしさが少なく、保守が容易になるため、コメントをカスタマイズして、このモデルでエクスポートする必要がある変数に付けました。このモデルのオブジェクトをメソッドとして渡し、このクラスのすべてのオブジェクト メンバー変数に定義されているカスタム属性を取り出す必要があります

例: 前の例に従って、部門テーブルと従業員テーブルという 2 つのテーブルをエクスポートすることになり、部門モデルと従業員モデルという 2 つのクラスが存在します。このとき、ジェネリック型を使用してパラメータを渡し、リフレクション##3 を通じて渡された型のカスタム アノテーション情報を取得できます。たとえば、リフレクションはクラスのプライベート メソッドまたはプロパティを取得します


例: クラスでメソッドを使用する必要がありますが、このメソッドは外部に公開されていません。どうすればよいでしょうか?リフレクションがあるので、心配ありません。

まず、このようなクラスを定義し、public、protected、private のそれぞれに変更されたフィールド、属性、メソッドを定義し、次にリフレクションを試してみましょう。

namespace ConsoleApplication1
{   
   public enum GenderEnum
    {         Boy = 0、         Girl = 1、         Dog = 2     }     public class WorkerModel     {




    

        /// <summary>
        /// 字段
        /// </summary>
        public string _name = "Hathway";
        プライベート int _id = 32;
        protected bool _isAdmin = true;
        public GenderEnum _gender = GenderEnum.Girl;


        /// <summary>
        /// プロパティ
        /// </summary>
        public string Name { get; 設定; public
        GenderEnum 性別 { get; 設定; プライベート
        int ID {取得; 設定; protected
        bool isAdmin { get; 設定; }

        /// <summary>
        /// メソッド
        /// </summary>
        public void Android()
        { 
        }
        protected void iOS()
        { 
        }
        private void WindowPhone()
        { 
        }


        /// <summary>
        /// コンストラクター
        /// </summary>
        public WorkerModel()
        { 
        }

        public WorkerModel(string name, int id, GenderEnum 性別, bool isAdmin) 
        { 
        }


    }

1
2
3
4
5
6
7
8
9
10
11
12
13 14
15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 4 4 45 46 47 48 49 50 51 52 53 54







































55
56
57
このクラスオブジェクトを定義し、リフレクションを使用してこのオブジェクトに関するさまざまな情報を取得しましょう

   WorkerModel worker = new WorkerModel() { 
            Name = "Jay",
            Gender = GenderEnum.Boy,
            };
1
2
3
4
1. フィールド情報—FieldInfo----type.getFields()
        public static void GetFieldValue(Object obj)
        {             //オブジェクトの型を取得します Type type             = obj.GetType();             //フィールドの値を取得します (パブリック型のみ) 辞書の値             FieldInfo[] fieldIn fos = type.GetFields();             foreach (var f in fieldInfos)             {                 //フィールド名                 string fieldName = f.Name;                 //フィールドタイプ









                文字列フィールドタイプ = f.FieldType.ToString();
                // フィールドの
                文字列 fieldValue = f.GetValue(obj).ToString();
                
                Console.WriteLine("フィールド名----->" + フィールド名 );
                Console.WriteLine( "fieldType------>" + fieldType );
                Console.WriteLine("フィールド値------>" + フィールド値);

                Console.WriteLine("-------------------------------------------------------------------");

            }
        }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23


2. プロパティ情報—PropertyInfo----type.GetProperties()
        public static void GetPropertyInfo(Object obj)
        {             Type type = obj.GetType();             PropertyInfo[] propertyInfo = type.GetProperties();             foreach (var p in propertyInfo)             {                 string propertyName = p.Name                 string propertyValue = p.GetValue(obj,null).ToString();                 Console.WriteLine("プロパティ名----->" + プロパティ名);                 Console.WriteLine("propertyValue----->" + propertyValue);                 Console.WriteLine("-------------------------------------------------------------------");


           


                            




            }
        }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16


3. メソッド情報—MethodInfo----type.GetMethods()
        public static void GetMethodInfo(Object obj)
        {             Type type = obj.GetType();             //変更されたパブリック メソッドをすべて取得             MethodInfo[] MethodInfo = type.GetMethods();             foreach (var m in methodInfo)             {                 string methodName = m .Name;                 Console.WriteLine("methodName----->" + methodName);                 Console.WriteLine("----------------------------------------------------------------");             }         } 1 2 3 4 5 6 7 8 9 10



            



              

             













11
12
13
14
15


4.成员情報—MemberInfo----type.GetMembers()
        public static void GetMemberInfo(Object obj)
        {             Type type = obj.GetType();             MemberInfo[] memberInfo = type.GetMembers();

            foreach (memberInfo の var m)
            {                 string memberName = m.Name;                 Console.WriteLine("メンバー名------>" + メンバー名);                 Console.WriteLine("-------------------------------------------------------------------");             }         } 1 2 3 4 5 6 7 8 9 10 11 12 13 14

 

              

















5. 構築方法情報—ConstructorInfo----type.GetConstructors()
    private static void GetConstructorInfo(Object obj)
        {             Type type = obj.GetType();             //すべてのパブリック修飾の構築メソッド             ConstructorInfo[]constructorInfo = type.GetConstructors();             foreach (constructorInfo の var c)             {                 string constructionName = c.Name;                 ParameterInfo[]constructorParams = c.GetParameters();                 Console.WriteLine("コンストラクター名----->" + コンストラクター名);                 foreach (var p in constructionParams)                 {                     Console.WriteLine("Params------ p.Name-->" + p.Name);











                    Console.WriteLine("Params----- p.Type--->"+ p.ParameterType);
                Console.WriteLine
                ("-------------------------------------------------------------------");

            }
        }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19


パブリックだけで十分ですか? 保護されたメンバー情報の取得 さて
、プライベート属性を取得することに興奮していますか? ちょっと待ってください。それは完全に予想を超えています。変更する必要があるのはコードを 1 行だけです。GetFields を例に挙げます。 1. パブリック変更を取得します

 //フィールドの値を取得します。パブリック型のディクショナリの値のみ
 FieldInfo[] fieldInfos = type.GetFields();
1
2
2. private および protected の値を取得します

//すべてのタイプの値を取得する
 FieldInfo[] fieldInfos = type.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);

1
2
3 2
番目の方法を使用して取得したフィールド情報がどのようなものかを確認し、印刷して確認してください。


        //         // 戻り結果:          // 現在の System.Type に定義されているすべてのパブリック フィールドを表す System.Reflection.FieldInfo オブジェクトの配列。- または -         現在の System.Type に定義されたパブリック フィールドがない場合は、 System.Reflection.FieldInfo 型の空の配列 //         public FieldInfo[] GetFields();         //         // 概要:          // 派生クラスでオーバーライドされると、指定されたバインディング制約を使用して現在の System.Type に定義されたフィールドを検索します。         //         // パラメータ:          // bindingAttr:















        // 検索の実行方法を指定する 1 つ以上の System.Reflection.BindingFlags で構成されるビットマスク。-または- null を返すにはゼロ。
        //
        // 戻り結果: 
        // 指定されたバインディング制約に一致する、現在の System.Type に定義されているすべてのフィールドを表す System.Reflection.FieldInfo オブジェクトの配列。- または
        // - 現在の System.Type にフィールドが定義されていない場合、または定義されたフィールドがバインディング制約に一致しない場合は、 // 型 System.Reflection.FieldInfo の空の配列
        。
        public abstract FieldInfo[] GetFields(BindingFlags bindingAttr);
1
2
3
4
5
6
7
8
9
10 11
12
13
14
15
16
17
18
19
20
21
last

とても遅くなりました。ベッドに戻ります。今週は時間があるので、BindFlags の具体的な使用方法を見ていきます。試してみると、BindFlags.Instance パラメータを追加する必要があることがわかりました。そうしないと取得できません。強迫性障害はその理由を知っているはずです。答えが見つかったらブログを書きます


———————————————
著作権声明: この記事は CSDN ブロガー「DRPrincess」のオリジナル記事であり、CC 4.0 BY-SA 著作権契約に従って、転載する場合は元のソースリンクとこの声明を添付してください。
元のリンク: https://blog.csdn.net/qq_32452623/article/details/53192398

おすすめ

転載: blog.csdn.net/u014090257/article/details/119725876