C#反射Assembly详细说明(1)
发表于2018-09-26
Assembly是一个包含来程序的名称,版本号,自我描述,文件关联关系和文件位置等信息的一个集合。在.net框架中通过Assembly类来支持,该类位于System.Reflection下,物理位置位于:mscorlib.dll。Assembly能干什么?我们可以通过Assembly的信息来获取程序的类,实例等编程需要用到的信息。
一个简单的演示实例:
1、建立一个Console工程名为:NamespaceRef
2、写入如下代码:
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
namespace NamespaceRef
{
class Program
{
static void Main(string[] args)
{
Country cy;
String assemblyName = @"NamespaceRef";
string strongClassName = @"NamespaceRef.Chinese";
// 注意:这里类名必须为强类名
// assemblyName可以通过工程的AssemblyInfo.cs中找到
cy = (Country)Assembly.Load(assemblyName).CreateInstance(strongClassName);
Console.WriteLine(cy.name);
Console.ReadKey();
}
}
class Country
{
public string name;
}
class Chinese : Country
{
public Chinese()
{
name = "你好";
}
}
class America : Country
{
public America()
{
name = "Hello";
}
}
}
由于Assembly的存在给我们在实现设计模式上有了一个更好的选择。
我们在开发的时候有时候会遇到这样的一个问题,根据对应的名称来创建指定的对象。如:给出china就要创建一个china对象,以前我们只能这样来写代码:
if (strongClassName == "China") cy = new China(); else if (strongClassName == "America") cy = new America();
那么如果我们有很长的一系列对象要创建,这样的代码维护起来是很困难的,而且也不容易阅读。现在我们可以通过在外部文件定义类的程序集名称和类的强名称来获得这样一个实例,即易于理解,又增强了扩展性还不用修改代码。cy=(Country)Assembly.Load(assemblyName).CreateInstance(strongClassName);
结论
Assembly类有很多的方法和属性,它和Type一样有很多功能用于名称与方法和属性之间的转化。深入理解这两个类,你就可以清晰通用语言层是如何工作。