C#反射呼び出し

5354 ワード

反射の意味
反射は、実行中にプログラム要素をチェックして処理する機能を記述する一般的な用語です.反射は、メソッドに動的にアクセスし、メソッドのメソッドにアクセスします.
反射の用途
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 Typeクラスのプロパティ:Nameデータ型名FullNameデータ型の完全修飾名(ネーミングスペース名を含む)Namespace定義データ型のネーミングスペース名IsAbstractは、タイプが抽象タイプIsArrayであるかどうかを示します.このタイプが配列IsClassであるかどうかを示します.このタイプがクラスIsEnumであるかどうかを示します.このタイプが列挙IsInterfaceであるかどうかを示します.このタイプがインタフェースIsPublicであるかどうかを示します.ValueTypeこのタイプが値タイプTypeクラスであるか否かを示す方法:GetConstructor()GetConstructors():ConstructorInfoタイプを返し、そのクラスのコンストラクション関数を取得するための情報GetEvent()GetEvents():EventInfoタイプを返し、そのクラスのイベントを取得するための情報GetField()、GetFields():FieldInfoタイプを返し、そのクラスのフィールドを取得する(メンバー変数)の情報GetInterface()、GetInterfaces():InterfaceInfoタイプを返し、そのクラス実装のインタフェースを取得するための情報GetMember()、GetMembers():このクラスのすべてのメンバーを取得するための情報GetMethod()、GetMethods():MethodInfoタイプを返し、そのクラスのメソッドを取得するための情報GetProperty(),GetProperties():TypeのInvokeMember()メソッドを呼び出すか,MethodInfo,PropertyInfo,その他のクラスのInvoke()メソッドを呼び出すかのようなPropertyInfoタイプを返します.クラス内の構築メソッドを表示します:NewClassw nc=new NewClassw();Type=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(); }
                :
    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();    
     Activator    :
    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 nc = new NewClassw();
    Type t = nc.GetType();
    PropertyInfo[] pis = t.GetProperties();
    foreach(PropertyInfo pi in pis)
    {
        Console.WriteLine(pi.Name);
    }

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

クラス内のpublicフィールドの表示
    NewClassw nc = new NewClassw();
    Type t = nc.GetType();
    FieldInfo[] fis = t.GetFields();
    foreach (FieldInfo fi in fis)
    {
        Console.WriteLine(fi.Name);
    } 

反射でオブジェクトを生成し、プロパティ、メソッド、フィールドを呼び出して操作します.
    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);

System.Reflection.AssemblyクラスAssemblyクラスは、プログラムセットの情報を取得したり、プログラムセットを動的にロードしたり、プログラムセットでタイプ情報を検索したりして、そのタイプのインスタンスを作成することができます.Assemblyクラスを使用すると、プログラムセット間の結合を低減することができ、ソフトウェア構造の合理化に役立ちます.
         Assembly  
    Assembly ass = Assembly.Load("ClassLibrary831");
  DLL      Assembly  
    Assembly ass = Assembly.LoadFrom("ClassLibrary831.dll");
  Assembly        
    Type t = ass.GetType("ClassLibrary831.NewClass");   //         
  Assembly          
    Type[] t = ass.GetTypes();

   //          
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.GetType();
foreach(Type t in aa)
{
    if(t.FullName == "a.b.c")
    {
        object o = Activator.CreateInstance(t);
    }
}