• 反射与依赖注入


    反射(松耦合-以不变应万变)

    不用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");
            }
        }
    }
    
  • 相关阅读:
    (转)写好程序注释的十三条建议
    注册表添加NoDrives隐藏盘符(禁用U盘)参数说明
    AJAX实用教程——开篇
    浅谈函数求解与人生
    C#(服务器)与Java(客户端)通过Socket传递对象
    BI开发之——Mdx基础语法(2)
    UML——序列图
    UML——序列图案例总结
    ORM内核原理解析之:延迟加载
    应用程序系统基本设计原则——SOLID
  • 原文地址:https://www.cnblogs.com/lpxspring/p/12461539.html
Copyright © 2020-2023  润新知