反射(松耦合-以不變應萬變)
不用new 操作符都能創建同類型的對象,訪問對象的各個成員,有new操作符是有類型依賴的。
程序在運行時處於動態,不能隨便改變類型,但是不清楚用戶可能的操作,所以讓程序在靜態時就做好准備,但是又不是枚舉每種類型。
using System;
using System.Reflection;
namespace Driver_core
{
internal class Program
{
public static void Main(string[] args)
{
ITank tank=new LightTank();
//不用靜態類型
var t=tank.GetType();//得到運行時動態類型的描述信息
object o= Activator.CreateInstance(t);
MethodInfo fire = t.GetMethod("Fire");
MethodInfo run = t.GetMethod("Run");
fire.Invoke(o, null);
run.Invoke(o, null);
}
}
class Driver
{
private IVehicle _vehicle;
public Driver(IVehicle vehicle)
{
_vehicle = vehicle;
}
public void Drive()
{
_vehicle.Run();
}
}
interface IVehicle
{
void Run();
}
class Car:IVehicle
{
public void Run()
{
Console.WriteLine("car is runnning!");
}
}
class Truck:IVehicle
{
public void Run()
{
Console.WriteLine("truck is running!");
}
}
interface ITank
{
void Fire();
void Run();
}
class LightTank:ITank
{
public void Fire()
{
Console.WriteLine("開炮");
}
public void Run()
{
Console.WriteLine("ka……ka……ka");
}
}
}
反射與接口的集合
反射與特性的集合
依賴注入
封裝好的反射。
引入denpendinjection 依賴
using System;
using System.Reflection;
using Microsoft.Extensions.DependencyInjection;
namespace Driver_core
{
internal class Program
{
public static void Main(string[] args)
{
var sc=new ServiceCollection();//服務提供者(容器)
sc.AddScoped(typeof(ITank),typeof(LightTank));//基接口動態類型描述,實現的類的類型
var sp = sc.BuildServiceProvider();
//從容器里去調用對象
ITank tank = sp.GetService<ITank>();
tank.Fire();
tank.Run();
}
}
class Driver
{
private IVehicle _vehicle;
public Driver(IVehicle vehicle)
{
_vehicle = vehicle;
}
public void Drive()
{
_vehicle.Run();
}
}
interface IVehicle
{
void Run();
}
class Car:IVehicle
{
public void Run()
{
Console.WriteLine("car is runnning!");
}
}
class Truck:IVehicle
{
public void Run()
{
Console.WriteLine("truck is running!");
}
}
interface ITank
{
void Fire();
void Run();
}
class LightTank:ITank
{
public void Fire()
{
Console.WriteLine("開炮");
}
public void Run()
{
Console.WriteLine("ka……ka……ka");
}
}
}