1、
static void Main(string[] args) { ITank tank=new HeavyTank(); //以下为反射的用法 var t=tank.GetType(); object o=Activator.CreateInstance(t); MethodInfo methodInfo = t.GetMethod("Fire"); //需要using System.Reflection; methodInfo.Invoke(tank, null); } } class Driver { private Ivehicle _vehicle; public Driver(Ivehicle vehicle) { _vehicle = vehicle; } public void Drive() { _vehicle.Run(); } } interface Ivehicle { void Run(); } class Car : Ivehicle { void Ivehicle.Run() { Console.WriteLine("Di Di..."); } } class Truck : Ivehicle { public void Run() { Console.WriteLine("Dii Dii..."); } } interface ITank:IWeapon,Ivehicle { //void Run(); } class LightTank : ITank { public void Fire() { Console.WriteLine("Xiu xiu.."); } public void Run() { Console.WriteLine("ka ka ka.."); } } class HeavyTank : ITank { public void Fire() { Console.WriteLine("Peng...."); } public void Run() { Console.WriteLine("来喽..."); } } interface IWeapon { void Fire(); }
2、反射
static void Main(string[] args) { //ITank tank=new HeavyTank(); //var t=tank.GetType(); //object o=Activator.CreateInstance(t); //MethodInfo methodInfo = t.GetMethod("Fire"); //methodInfo.Invoke(tank, null); var services = new ServiceCollection(); services.AddScoped(typeof(ITank),typeof(HeavyTank)); //当需要替换HeavyTank时,只需要替换这一处即可 var sp= services.BuildServiceProvider(); //=================================== ITank tank = sp.GetService<ITank>(); tank.Fire(); tank.Run(); }
3、依赖注入
static void Main(string[] args) { //ITank tank=new HeavyTank(); //var t=tank.GetType(); //object o=Activator.CreateInstance(t); //MethodInfo methodInfo = t.GetMethod("Fire"); //methodInfo.Invoke(tank, null); var services = new ServiceCollection(); services.AddScoped(typeof(ITank),typeof(HeavyTank)); services.AddScoped(typeof(Ivehicle), typeof(Car)); //将需要的类型都添加到容器里,在这里已经将Car传入了容器,介就叫【依赖注入】 services.AddScoped<Driver>(); //=================================== var sp = services.BuildServiceProvider(); var driver = sp.GetService<Driver>(); driver.Drive(); //就可以直接调用方法了,而不用向构造函数中传入对象,因为↑已经传入对象类型参数了 }
浙公网安备 33010602011771号