使用Assembly来开发c#程序_weixin_33695450的博客-程序员秘密

技术标签: 设计模式  

什么是Assembly(程序集)?
Assembly是一个包含来程序的名称,版本号,自我描述,文件关联关系和文件位置等信息的一个集合。在.net框架中通过Assembly类来支持,该类位于System.Reflection下,物理位置位于:mscorlib.dll。

Assembly能干什么?
我们可以通过Assembly的信息来获取程序的类,实例等编程需要用到的信息。

一个简单的演示实例:
1.建立一个Console工程名为:NamespaceRef
2.写入如下代码:

 1 None.gif using  System;
 2 None.gif using  System.Collections.Generic;
 3 None.gif using  System.Text;
 4 None.gif using  System.Reflection;
 5 None.gif
 6 None.gif namespace  NamespaceRef
 7 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
 8InBlock.gif    class Program
 9ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
10InBlock.gif        static void Main(string[] args)
11ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
12InBlock.gif            Country cy;
13InBlock.gif            String assemblyName = @"NamespaceRef";
14InBlock.gif            string strongClassName = @"NamespaceRef.China";
15InBlock.gif            // 注意:这里类名必须为强类名
16InBlock.gif            // assemblyName可以通过工程的AssemblyInfo.cs中找到
17InBlock.gif            cy = (Country)Assembly.Load(assemblyName).CreateInstance(strongClassName);
18InBlock.gif            Console.WriteLine(cy.name);
19InBlock.gif            Console.ReadKey();
20ExpandedSubBlockEnd.gif        }

21ExpandedSubBlockEnd.gif    }

22InBlock.gif
23InBlock.gif    class Country
24ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
25InBlock.gif        public string name;
26ExpandedSubBlockEnd.gif    }

27InBlock.gif
28InBlock.gif    class Chinese : Country
29ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
30InBlock.gif        public Chinese()
31ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
32InBlock.gif            name = "你好";
33ExpandedSubBlockEnd.gif        }

34ExpandedSubBlockEnd.gif    }

35InBlock.gif
36InBlock.gif    class America : Country
37ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
38InBlock.gif        public America()
39ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
40InBlock.gif            name = "Hello";
41ExpandedSubBlockEnd.gif        }

42ExpandedSubBlockEnd.gif    }

43ExpandedBlockEnd.gif}

由于Assembly的存在给我们在实现设计模式上有了一个更好的选择。
我们在开发的时候有时候会遇到这样的一个问题,根据对应的名称来创建指定的对象。如:给出chinese就要创建一个chinese对象,以前我们只能这样来写代码:
1 None.gif if  (strongClassName  ==   " China " )
2 None.gif    cy  =   new  China();
3 None.gif else   if  (strongClassName  ==   " America " )
4 None.gif    cy  =   new  America();
那么如果我们有很长的一系列对象要创建,这样的代码维护起来是很困难的,而且也不容易阅读。现在我们可以通过在外部文件定义类的程序集名称和类的强名称来获得这样一个实例,即易于理解,又增强了扩展性还不用修改代码。
cy = (Country)Assembly.Load(assemblyName).CreateInstance(strongClassName);

结论
Assembly类有很多的方法和属性,它和Type一样有很多功能用于名称与方法和属性之间的转化。深入理解这两个类,你就可以清晰通用语言层是如何工作。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33695450/article/details/86281858

智能推荐

org.postgresql.util.PSQLException: 这个 ResultSet 已经被关闭。_weixin_30425949的博客-程序员秘密

使用postgresql报错:org.postgresql.util.PSQLException: 这个 ResultSet 已经被关闭。是因为我用的是10版本,之前的postgresql是9版本,mavenjar也随之升级使用上面的4.2版本即可转载于:https://www.cnblogs.com/zhengyuanyuan/p/10544650.html...

2021-11-04 《计算机操作系统》(第四版)学习笔记:第四章_蔗理苦的博客-程序员秘密

文章目录第四章 存储器管理4.1 存储器的层次结构4.1.1 多层结构的存储器系统4.1.2 主存储器与寄存器4.1.3 高速缓存和磁盘缓存4.2 程序的装入和链接4.2.1 地址以及映射4.2.2 程序的装入4.2.3 程序的链接4.3 连续分配存储管理方式4.3.1 单一连续分配4.3.2 固定分区分配4.3.3 动态分区分配4.3.4 基于顺序搜索的动态分区分配算法4.3.5 基于索引搜索的动态分区分配算法4.3.6 动态可重定位分区分配4.3.7 分区的保护4.4 对换4.4.1 引入4.4.2 原

ListCtrl使用ImageList插入BMP文件_小马喝水的博客-程序员秘密

今天在论坛上面看到一个帖子,楼主使用ImageList添加BMP文件,然后在ListCtrl中使用,代码如下: 1: CImageList* m_imagelist; 2: m_imagelist = new CImageList(); 3: m_imagelist->Create(32, 32, ILC_COLOR32, 0, 4); 4: HBITMAP hBitmap; 5: CBitmap *pBitmap; 6: CString FilePathName =

LeetCode -- 1239. 串联字符串的最大长度_星空暗影的博客-程序员秘密

import java.util.HashMap;import java.util.HashSet;import java.util.List;import java.util.Map;/** * 1239. 串联字符串的最大长度 * * 首先分析题意:在给定的字符串数组中进行选择,让选择的结果尽可能多的去覆盖一个1 * 26的矩阵 * (每个字母只能出现一次,所以最大为 1 * 26) * * 常用解法:剪枝DFS(暴力DFS比较简单,但是容易超时,所以需要剪枝优化) * 1 预处

短视频PHP源码RecyclerView 点击Item 改变文字颜色及背景色、线条颜色_云豹网络科技的博客-程序员秘密

实现思路在Fragment或者Activity中做个标记currentPosition在点击了Item的时候将position记录下来,并刷新适配器然后在Adapter中设置回调监听,在convert()方法中设置回调监听最后在Fragment或者Activity使用监听判断当前位置是否和传入的position是否一致一致就设置选中的背景,文字颜色,及线条颜色不一致就要修改Item中的背景,文字颜色,及线条颜色好了 思路差不多就这样,下面看实现代码 很简单代码实现Fragment或Acti

职场没有岁月静好,只有不进则退_weixin_34123613的博客-程序员秘密

本文首发于微信公共号: 中产之路星友提问,获当事人同意,隐去敏感信息,发表在这里。京杭君您好,之前关注您公众号并加微信过一段时间,对您表示敬仰。介绍一下我个人情况,是某211在读研二,之前在头部当红短视频创业公司做过算法类的实习,因加班太多,现在北京FLAG某外企做全栈开发的实习,但是手头还有一个BAT的机器学习暑假实习offer(外地)。最近甲骨文裁员和mao-yi-zhan搞的在外企待...

随便推点

第5章 构造、解构、拷贝语义学_一枚小码农的博客-程序员秘密

5.1 纯虚拟函数的存在我们可以定义和调用一个纯虚函数,不过只能被静态调用,不能由虚拟机制调用:inline void Abstract_base::interface() const{}inline void Concrete_derived::interface() const{ Abstract_base::interface();}PS:类中的pure virtu...

android应用开发之转屏(拷贝篇)_sanbo_xyz的博客-程序员秘密

Android横竖屏要解决的问题应该就两个:一.布局问题二.重新载入问题1.布局问题:如果不想让软件在横竖屏之间切换,最简单的办法就是在项目的AndroidManifest.xml中找到你所指定的activity中加上android:screenOrientation属性,他有以下几个参数:"unspecified":默认值 由系统来判断显示方向.判定的策略

简单的RPC框架_chenizhou5375的博客-程序员秘密

梁飞哥在他的博客里面做了个简洁的Rpc框架小例子,俺改了下,做成支持注册多个服务的 RpcFramework的代码如下 packagenet.rpc;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream...

汉字转拼音 (精简版-使用小型)_zhoubowen_的博客-程序员秘密

using System;using System.Collections.Generic;using System.Text;using System.Text.RegularExpressions;namespace COMMON{    public class Hz2Py    {        private static int[] pyValue

打开vscode会出现Vetur can‘t find `tsconfig.json` or `jsconfig.json` 警告,如何去除关闭忽略_m0_67401382的博客-程序员秘密

首先打开左下角的设置按钮中的设置,在搜索框中输入vetur.ignore,并在勾选框中勾选即可