ホームページ >バックエンド開発 >C#.Net チュートリアル >リフレクションとIOC
リフレクションのメカニズムは、実行状態では、どのクラスでも、このクラスのすべてのプロパティとメソッドを知ることができ、その種類のメソッドを呼び出すことができます。オブジェクトのメソッドを動的に取得して動的に呼び出す機能は、リフレクション メカニズムと呼ばれます。リフレクション機構は動的にメソッドを取得して利用する仕組みであり、クラスのオブジェクトを直接作成して直接呼び出すのとは全く異なります。たとえば、クラスにプライベートなプロパティまたはメソッドがある場合、それを直接呼び出すことはできませんが、リフレクション メカニズムを使用して動的に呼び出すことができます。
IOCの最大の利点は、オブジェクト生成がXMLで定義されているため、実装サブクラスを変更する必要がある場合、非常に簡単になることです(通常、そのようなオブジェクトは特定のインターフェイスに実装されている場合)、XML を変更するだけで、オブジェクトのホットプラグ(USB インターフェイスや SCSI ハードディスクのようなもの)を実現することもできます。 IOC が適用されない前に、オブジェクトが別のオブジェクトに依存する場合 (以下、これを依存オブジェクトおよび依存オブジェクトと呼びます)、依存オブジェクト内のメソッドを実行できるように、依存オブジェクト内で依存オブジェクトをインスタンス化する必要があります。と呼ばれた。明らかに、この結合度は比較的高く、私たちのプログラミング原則に準拠していません。したがって、今回は、依存オブジェクトを依存オブジェクトに直接配信する役割を担うサードパーティ オブジェクトを導入し、両者間の結合を軽減します。次の図は、IOC コンテナを追加する前と後のシステム内のオブジェクトの結合度を比較したものです。図 1 に示すように、IOC コンテナがソフトウェア システムに導入される前は、オブジェクト A がオブジェクト B に依存していました。オブジェクト A が初期化されるか、特定の時点まで実行されると、オブジェクト B を積極的に作成するか、すでに作成されているオブジェクト B を使用する必要があります。オブジェクト B を作成する場合も使用する場合も、コントロールはあなたの手の中にあります。 IOC コンテナがソフトウェア システムに導入された後、この状況は完全に変わりました。図 2 に示すように、IOC コンテナの追加により、オブジェクト A が実行されると、オブジェクト A とオブジェクト B の間の直接の接続が失われます。 B の場合、IOC コンテナはオブジェクト B をアクティブに作成し、オブジェクト A が必要とする場所にそれを挿入します。 前後を比較すると、オブジェクト A がオブジェクト B に依存する過程が能動的な動作から受動的な動作に変化し、制御権が逆転することがわかります。これが「反転」の名前の由来です。コントロール"。
インスタンス
リフレクションサンプルコード
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace StudentDAL { public class Student { //属性 public string Name{get;set;} public int Age { get; set; } //无参数构造函数 public Student() { this.Name = "无参数"; this.Age = 0; } //有参数构造函数 public Student(string name, int age) { this.Name = "name"; this.Age = age; } //public带参带返回值函数 public string PublishMethodReturn() { return string.Format("我叫"+Name+"年龄" +Age); } } }</strong></span>
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Reflection; namespace ITOO_Reflection { class Program { static void Main(string[] args) { //使用 Assembly 定义和加载程序集, //加载在程序集清单中列出的模块, //以及从此程序集中查找类型并创建该类型的实例. //获取程序集 Assembly assembly = Assembly.Load("StudentDAL"); //从程序及获取指定对象类型 Type type = assembly.GetType("StudentDAL.Student"); var instance = assembly.CreateInstance("StudentDAL.Student"); //为学生类的属性赋值 type.GetProperty("Name").SetValue(instance, "shx", null); type.GetProperty("Age").SetValue(instance, 18, null); //获取Student类的方法 var method = type.GetMethod("PublishMethodReturn"); //调用Student类的成员方法PublishMethodReturn var S= method.Invoke(instance, null); Console.WriteLine(S); Console.Read(); } } }</strong></span>
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ITOO.IOC.IDAL { public interface IUserDal { void HelloWord(); } } </strong></span>
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System; using System.Collections.Generic; using System.Linq; using System.Text; using ITOO.IOC.IDAL; namespace ITOO.IOC.DAL { public class User:IUserDal { public void HelloWord() { Console.WriteLine("helloword"); } } } </strong></span>
<span style="font-family:KaiTi_GB2312;font-size:18px;color:#666666;"><strong>using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ITOO.IOC.IBLL { public interface IUserBll { void HelloWord(); } } </strong></span>rreerree
実行結果
以上です。 IOC の内容については、PHP 中国語 Web サイト (www.php.cn) に注目してください。