反射
有關程式及其型別的資料被稱為元資料,保存在程式的程式集
一個運行的程式查看本身的元資料或者其他程式的元資料的行為叫反射
一遍下來啥都沒整明白?沒事,咱只是慣例行事,先放定義,
反射reflection,這個詞也有映像的意思,反正不管中文叫啥,正常的情況咱們是通過new來獲得一個實體化物件,但通過反射可以不使用new來獲得物件,
動態創建類并呼叫其方法
先拋開反射這些亂七八糟的東西,我們來想想看:當你打開了游戲充值頁面想要變強的時候,界面是不是有很多個選項?支付寶付款,微信支付,銀行卡支付,應有盡有,反正只要你想掏錢,我們一定不會讓爺您這錢花不出去,
作為一個愛思考的程式員,在卡上數字減少的時候,你已經在面無表情的思考這個支付頁面背后的邏輯了,那怎么做呢?最簡單的當然是寫 if else 陳述句,他是第幾個radio你就呼叫哪個進行付款,
這樣做確實沒什么問題,但會不會麻煩了一點?銀行支付那么多個銀行,每增加一個就寫一句if 嗎?這就完全是體力活了,有沒有辦法可以省事一點呢?最好我說用支付寶付款就用支付寶付款,你別說,還真可以,
終于輪到我們的主角反射登場了!BCL宣告了一個Type抽象類,使用Type類的物件可以獲取到程式使用的型別資訊,我們可以用GetType或者typeof運算子來獲取Type物件,
Type類成員
Name 回傳型別名字
Namespace 回傳包含型別宣告的命名空間
Assembly 回傳宣告型別的程式集
GetFields 回傳型別的欄位串列
GetProperties 回傳型別的屬性串列
GetMethods 回傳型別的方法串列
我們從前端界面得知了要呼叫的類名,現在我們根據它的名字來創建實體并呼叫pay方法進行支付,
using System;
using System.IO;
using System.Reflection;
namespace Sample
{
class ZhiFuBao
{
public void Pay(string money)
{
Console.WriteLine($"使用支付寶支付{money}元");
}
}
class WeiXing
{
public void Pay(string money)
{
Console.WriteLine($"使用微信支付{money}元");
}
}
class Program
{
static void Main(string[] args)
{
//獲取命名空間
string nameSpace = Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetExecutingAssembly().Location);
//要呼叫的類名
string className = "ZhiFuBao";
Type type = Type.GetType(nameSpace + "." + className);
//生成實體
object obj = Activator.CreateInstance(type);
//獲取pay方法并呼叫
MethodInfo method = type.GetMethod("Pay");
method.Invoke(obj,new object[]{ "666" });
//呼叫微信支付
className = "WeiXing";
type = Type.GetType(nameSpace + "." + className);
obj = Activator.CreateInstance(type);
method = type.GetMethod("Pay");
method.Invoke(obj, new object[] { "666" });
/*
* 程式輸出結果為:
* 使用支付寶支付666元
* 使用微信支付666元
*/
}
}
}
怎么樣?代碼是不是一下就少了很多,其實反射的功能遠不止這些,
依賴注入
我們還可以用別人封裝好的反射來實作依賴注入,駕駛員駕駛車輛,擁有私有屬性IVehicle ,Car和Tank類都實作了IVehicle介面,
class Program
{
static void Main(string[] args)
{
//注冊服務
var sc = new ServiceCollection();
sc.AddScoped(typeof(IVehicle), typeof(Car));
sc.AddScoped<Driver>();
var sp = sc.BuildServiceProvider();
var driver = sp.GetService<Driver>();
driver.Drive();
}
}
如果我們有一天要開坦克了,那么也只需要把typeof(car)換成Tank就行,
何為依賴注入呢?說的直白點,就是統一實體化物件,把他們都放在一個公共的容器里,誰要用就拿給誰,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/50945.html
標籤:C#
