zoukankan      html  css  js  c++  java
  • .NET 程序集Assembly使用

    概述

      一直以来,我们都在用C#编写程序,编写程序的时候,我们用到继承、多态、接口以及泛型,我们也都明白子类可以继承抽象类,并能够重写父类的抽象方法,可是大家是否想过,如下几个问题:

      1、凡树必有根和叶,类的继承也如此,如何通过程序集查找所有继承父类的之类的程序集名称?

      2、如果程序B被其他程序调用,如何通过程序集查询调用B的所有程序?

      3、如何查询当前项目通过添加引用了哪些程序集?

    带上上面的三个问题,我们来学习下.NET 程序集 Assembly。

    查询继承父类的程序集合BaseType

      .NET的程序集对象Assembly有个属性BaseType,来返回当前程序集的基础类型,默认是Object。通过该属性可以判断某个程序集是否是继承了某个父类;

    程序集B被A程序引用,获取A程序集的信息GetCallingAssembly

      .NET的程序集对象Assembly有个方法GetCallingAssembly获取当前程序集被调用的上级程序集的信息;

    查找当前项目的程序集GetAssemblies

      查找当前项目所有程序集的方法System.AppDomain.CurrentDomain.GetAssemblies();

    实例化对象

      通过程序集GetType()获取程序集的数据类型,通过Activator.CreateInstance(type) 便可创建响应的实例对象;

         整体使用的代码如下:BaseService是所有服务类的基类

                List<Type> TypeItemList = new List<Type>();
                //var ResultTypeList = Assembly.GetEntryAssembly();
                //if (ResultTypeList == null)
                //{
                //    ResultTypeList = Assembly.GetCallingAssembly();
                //    var ItemList = ResultTypeList.GetReferencedAssemblies().Where(p => p.GetType() == typeof(BaseService));                
                //}
                Assembly[] AssbyCustmList = System.AppDomain.CurrentDomain.GetAssemblies();
                foreach (Assembly assItem in AssbyCustmList)
                {
                    TypeItemList.AddRange(assItem.GetTypes().Where(x => x.BaseType == typeof(BaseService)).ToList());
                }
                //IEnumerable<Type> TypeItemList = CurType.Assembly.GetExportedTypes().Where(x => x.BaseType == typeof(BaseService)).ToList();
                //IEnumerable<Type> TypeItemList = ResultTypeList.GetTypes().Where(x => x.BaseType == typeof(BaseService)).ToList();
                BaseService TarService = null;
                foreach (Type typeitem in TypeItemList)
                {
                    if (_Reporttory.Count(p => p.GetType() == typeitem) == 0)
                    {
                        TarService = (Activator.CreateInstance(typeitem) as BaseService);
                    }
                    else
                    {
                        TarService = _Reporttory.First(p => p.GetType() == typeitem);
                    }
                    TarService.Start();
                }         
  • 相关阅读:
    分段路由的复兴
    动态维护FDB表项实现VXLAN通信
    neutron dhcp 高可用
    wpf
    从0到1设计一台8bit计算机
    哇塞的Docker——vscode远程连接Docker容器进行项目开发(三)
    中通消息平台 Kafka 顺序消费线程模型的实践与优化
    飞机大战 python小项目
    看透确定性,抛弃确定性
    如何根据普通ip地址获取当前地理位置
  • 原文地址:https://www.cnblogs.com/xibei666/p/6243424.html
Copyright © 2011-2022 走看看