反射と依存関係の注入

反射(疎結合 - 現状維持)

いいえ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");
        }
    }
}

おすすめ

転載: www.cnblogs.com/lpxspring/p/12461539.html