反射與依賴注入


反射(松耦合-以不變應萬變)

不用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");
        }
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM