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();                            //就可以直接调用方法了,而不用向构造函数中传入对象,因为↑已经传入对象类型参数了
            
        }

 

posted on 2023-02-23 21:11  漂乎兮乎  阅读(47)  评论(0)    收藏  举报