ASP.NET反射



2つの現実の例:
1、超音波検査:みんな健康診断の時に超音波検査をしたことがあるでしょう.超音波検査は腹の皮を通してあなたの内臓の生理状況を探知することができます.これはどのようにしてできたのでしょうか.B超音波はB型超音波で、お腹の皮を通してあなたの体内にB型超音波を発射することができます.超音波が内臓壁にぶつかると一定の「エコー」反射が発生し、「エコー」を処理すれば内臓の状況が表示されます(私は医者でも音響専門家でもないので、正確かどうか分かりません^^).
2、地球の内部構造:地球の内部構造は大体3層に分けることができる:地殻、マントルと地核.地殻は固体、地核は液体、マントルは半液半固の構造(中学校の地理の内容、皆さんは覚えていますか?)どのように地球の表面で地球の内部に深く入り込まなくてもその内部の構造を知っていますか?はい、地球に「地震波」を打ち上げると、「地震波」には「横波」と「縦波」の2種類があります.「横波」は固体のみを貫通し、「縦波」は固体も液体も貫通する.縦波と横波の逆戻りに直面することで、地球内部の構造をほぼ断定することができる.
この2つの例の共通の特徴は,1つのオブジェクトの外部からオブジェクトの内部の構造を理解し,波の反射機能を利用していることである.はい.NETの反射は、オブジェクト(またはプログラムセット)の内部構造をオブジェクトの外部から理解する機能を実現することもできる、このオブジェクト(またはプログラムセット)が何なのか分からなくても、また.NETでの反射は、オブジェクトを作成し、その方法を実行することもできます.
反射は.NETの重要なメカニズムは、実行時にプログラムまたはプログラムセットの各タイプ(クラス、構造、委任、インタフェース、列挙などを含む)のメンバーとメンバーの情報を反射することによって得ることができる.反射があれば、それぞれのタイプを手のひらで知ることができます.また、このオブジェクトのタイプがコンパイル時にまだ分からない場合でも、オブジェクトを直接作成することもできます.反射の用途:(1)Assemblyを使用してプログラムセットを定義およびロードし、プログラムセットリストにモジュールをリストし、このプログラムセットからタイプを検索してそのタイプのインスタンスを作成します.(2)Moduleを用いてモジュールを含むプログラムセットやモジュール内のクラスなどを理解し,モジュール上で定義されたすべてのグローバルメソッドや他の特定の非グローバルメソッドを取得することもできる.(3)コンストラクション関数の名前、パラメータ、アクセス修飾子(pulicやprivateなど)、実装の詳細(abstractやvirtualなど)をConstructorInfoを使用して理解する.(4)MethodInfoを使用して、メソッドの名前、戻りタイプ、パラメータ、pulicやprivateなどのアクセス修飾子、abstractやvirtualなどの実装詳細を理解します.(5)フィールド名、publicやprivateなどのアクセス修飾子、staticなどの実装詳細をFiedInfoを使用して理解し、フィールド値を取得または設定します.(6)EventInfoを使用して、イベント名、イベントハンドラデータ型、カスタム属性、宣言タイプ、反射タイプなどを把握し、イベントハンドラを追加または削除します.(7)PropertyInfoを使用して、属性の名前、データ型、宣言型、反射型、読み取り専用または書き込み可能な状態などを把握し、属性値を取得または設定します.(8)パラメータ名,データ型,入力パラメータか出力パラメータか,メソッド署名におけるパラメータの位置などをParameterInfoを用いて知る.
使用する名前空間を反射する:System.Reflection     System.Type     System.Reflection.Assembly反射で使用される主なクラス:System.Typeクラス--このクラスを使用して、指定されたデータ型の情報にアクセスできます.    System.Reflection.Assemblyクラス–特定のプログラムセットの情報にアクセスしたり、プログラムにロードしたりすることができます.     System.Type類:System.Typeクラスは反射に対してコアとして機能する.しかし、これは抽象的なベースクラスであり、Typeには各データ型に対応する派生クラスがあり、この派生クラスのオブジェクトのメソッド、フィールド、属性を使用してそのタイプに関するすべての情報を検索します.与えられたタイプのType参照を取得するには、●C#typeof演算子を使用する3つの一般的な方法があります.        Type t = typeof(string); ●オブジェクトGetType()メソッドを使用します.        string s = "grayworm";         Type t = s.GetType();・Typeクラスの静的メソッドGetType()を呼び出すこともできます.        Type t = Type.GetType("System.String"); 上記の3種類のコードはいずれもstringタイプのTypeを取得しており,stringタイプのTypeがtを参照すると,tによってstringタイプの構造を検出することができる.          
            string n = "grayworm";
            Type t = n.GetType();
            foreach (MemberInfo mi in t.GetMembers())
            {
                Console.WriteLine("{0}\t{1}",mi.MemberType,mi.Name);
            }

Typeクラスのプロパティ:Nameデータ型名FullNameデータ型の完全修飾名(ネーミングスペース名を含む)Namespace定義データ型のネーミングスペース名IsAbstractは、タイプが抽象タイプであるかどうかを示すIsArrayは、タイプが配列であるかどうかを示すIsClassは、タイプがクラスであるかどうかを示すIsEnumは、タイプが列挙されているかどうかを示すIsInterfaceは、タイプがインタフェースであるかどうかを示すIsPublicは、タイプを示す共通のIsSealedがこのタイプが密封クラスかどうかを示すIsValueTypeがこのタイプが値タイプTypeクラスかどうかを示す方法:GetConstructor()GetConstructors():ConstructorInfoタイプを返し、そのクラスの構造関数を取得するための情報GetEvent()GetEvents():EventInfoタイプを返し、このクラスのイベントを取得するための情報GetField()、GetFields():FieldInfoタイプを返し、そのクラスのフィールド(メンバー変数)を取得するための情報GetInterface()、GetInterfaces():InterfaceInfoタイプを返し、そのクラスが実現するインタフェースを取得するための情報GetMember()、GetMembers():MemberInfoタイプを返し、クラスのすべてのメンバを取得するための情報GetMethod()、GetMethods():MethodInfoタイプを返し、クラスのメソッドを取得するための情報GetProperty()、GetProperties():PropertyInfoタイプを返し、クラスの属性を取得するための情報はこれらのメンバを呼び出すことができ、TypeのInvokeMember()メソッドを呼び出すか、MethodInfoを呼び出すか、PropertyInfoと他のクラスのInvoke()メソッド.クラス内の構築方法を表示するには、次の手順に従います.
        NewClassw nc = new NewClassw();
        Type t = nc.GetType();
        ConstructorInfo[] ci = t.GetConstructors();    //          
        foreach (ConstructorInfo c in ci) //         
        {
            ParameterInfo[] ps = c.GetParameters();    //             
            foreach (ParameterInfo pi in ps)   //                
            {
                Console.Write(pi.ParameterType.ToString()+" "+pi.Name+",");
            }
            Console.WriteLine();
        }

コンストラクション関数を使用してオブジェクトを動的に生成するには、次の手順に従います.
<span style="color:#000000;">        Type t = typeof(NewClassw);
        Type[] pt = new Type[2];
        pt[0] = typeof(string);
        pt[1] = typeof(string);
        //             
        ConstructorInfo ci = t.GetConstructor(pt); 
        //  Object  ,            
        object[] obj = new object[2]{"grayworm","hi.baidu.com/grayworm"};   
        //           
        object o = ci.Invoke(obj);    
        //                     
        //((NewClassw)o).show();    </span>

   
 
Activatorでオブジェクトを生成するには、次の手順に従います.
<span style="color:#000000;">        Type t = typeof(NewClassw);
        //        
        object[] obj = new object[2] { "grayworm", "hi.baidu.com/grayworm" };   
        // Activator CreateInstance    ,      
        object o = Activator.CreateInstance(t,"grayworm","hi.baidu.com/grayworm"); 
        //((NewClassw)o).show();</span>

   
 
クラスのプロパティを表示するには、次の手順に従います.
<span style="color:#000000;">        NewClassw nc = new NewClassw();
        Type t = nc.GetType();
        PropertyInfo[] pis = t.GetProperties();
        foreach(PropertyInfo pi in pis)
        {
            Console.WriteLine(pi.Name);
        }
    </span>

   
 
クラス内のpublicメソッドを表示するには、次の手順に従います.
<span style="color:#000000;">        NewClassw nc = new NewClassw();
        Type t = nc.GetType();
        MethodInfo[] mis = t.GetMethods();
        foreach (MethodInfo mi in mis)
        {
            Console.WriteLine(mi.ReturnType+" "+mi.Name);
        }</span>

クラス内のpublicフィールドの表示
<span style="color:#000000;">        NewClassw nc = new NewClassw();
        Type t = nc.GetType();
        FieldInfo[] fis = t.GetFields();
        foreach (FieldInfo fi in fis)
        {
            Console.WriteLine(fi.Name);
        }</span>

      
 
   
 
反射でオブジェクトを生成し、プロパティ、メソッド、フィールドを呼び出して操作します.
<span style="color:#000000;">        NewClassw nc = new NewClassw();
        Type t = nc.GetType();
        object obj = Activator.CreateInstance(t);
        //  ID   
        FieldInfo fi = t.GetField("ID");
        // ID     
        fi.SetValue(obj, "k001");
        //  MyName   
        PropertyInfo pi1 = t.GetProperty("MyName");
        // MyName     
        pi1.SetValue(obj, "grayworm", null);
        PropertyInfo pi2 = t.GetProperty("MyInfo");
        pi2.SetValue(obj, "hi.baidu.com/grayworm", null);
        //  show   
        MethodInfo mi = t.GetMethod("show");
        //  show   
        mi.Invoke(obj, null);</span>

       
 
System.Reflection.Assemblyクラス
 
Assemblyクラスは、プログラムセットの情報を取得したり、プログラムセットを動的にロードしたり、プログラムセットでタイプ情報を検索したりして、そのタイプのインスタンスを作成することができます.
Assemblyクラスを使用すると、プログラムセット間の結合を低減でき、ソフトウェア構造の合理化に有利です.
   
 
   
 
セット名でAssemblyオブジェクトAssembly ass=Assemblyを返します.Load("ClassLibrary831"); DLLファイル名でAssemblyオブジェクトAssembly ass=Assemblyを返します.LoadFrom("ClassLibrary831.dll"); プログラムセットクラスType t=ass.GetType("ClassLibrary 831.NewClass");//パラメータはクラスのフルネームである必要があります.AssemblyでプログラムセットのすべてのクラスType[]t=ass.GetType()を取得します.      
 
   
//プログラムセット名で反射
    Assembly ass = Assembly.Load("ClassLibrary831");
    Type t = ass.GetType("ClassLibrary831.NewClass");
    object o = Activator.CreateInstance(t, "grayworm", "http://hi.baidu.com/grayworm");
    MethodInfo mi = t.GetMethod("show");
    mi.Invoke(o, null);

//DLLファイルですべてのタイプをフルネームで反射
    Assembly assembly = Assembly.LoadFrom("xxx.dll   ");
    Type[] aa = a.GetTypes();
    foreach(Type t in aa)
    {
        if(t.FullName == "a.b.c")
        {
            object o = Activator.CreateInstance(t);
        }
    }

コードを添付します...(転載):
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Collections;
using System.Reflection;

namespace KycBaseModule
{
    public class KycFunction
    {
        public KycFunction() { }
        /// <summary>
        ///    IList DataSet   
        /// </summary>
        /// <param name="ResList">    IList</param>
        /// <returns>    DataSet</returns>
        public static DataSet ListToDataSet(IList ResList)
        {
             DataSet RDS=new DataSet();
             DataTable TempDT = new DataTable();

            //    IList         DataTable
             System.Reflection.PropertyInfo[] p = ResList[0].GetType().GetProperties();
            foreach (System.Reflection.PropertyInfo pi in p)
            {
                 TempDT.Columns.Add(pi.Name,System.Type.GetType(pi.PropertyType.ToString()));
             }

            for (int i = 0; i < ResList.Count; i++)
            {
                 IList TempList = new ArrayList();
                // IList        ArrayList
                foreach (System.Reflection.PropertyInfo pi in p)
                {
                    object oo = pi.GetValue(ResList[i], null);
                     TempList.Add(oo);
                 }
                
                object[] itm=new object[p.Length];
                //  ArrayList object[]    
                for (int j = 0; j < TempList.Count; j++)
                {
                     itm.SetValue(TempList[j], j);
                 }
                // object[]     DataTable
                     TempDT.LoadDataRow(itm, true);
             }
            // DateTable  DataSet
             RDS.Tables.Add(TempDT);
            //  DataSet
            return RDS;
         }
     }
}