1、反射概念
反射指程序可以访问、检测和修改它本身状态或行为的一种能力。
程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。
使用反射可以动态的创建类型的实例(不再是通过new的方式创建)。将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问字段和属性。
通俗的讲:通过使用一个“程序集”把我们要使用的类的“命名空间”、“类名”通过“字符串”方式,使用反射技术,从而得到这个类的对象。
优点:1、反射提高了程序的灵活性和扩展性。
2、降低耦合性,提高自适应能力。
3、它允许程序创建和控制任何类的对象,无需提前硬编码目标类。
2、反射的使用
1、引入命名空间 :using System.Reflection;
2、使用程序集类:Assembly
3、反射结果为接口类型,实时解耦。
static void Test5()
{
//Assembly.Load("程序集名称").CreateInstance("命名空间.类名")
IEquipOperation eOperation =
(IEquipOperation)Assembly.Load("thinger.Interface").
CreateInstance("thinger.Interface.EquipOperationImpl");
eOperation.Start("10005");
Console.WriteLine(eOperation.Accelerate());
Console.WriteLine(eOperation.Decelerate());
eOperation.Stop();
}
通过上述方式,可以不通过new的方法,通过反射技术获得想要的对象。
3、反射的应用
将反射技术所需要的“程序集”名称、“命名空间.类型”名称,放在配置文件"App.config"中,在后续打包程序后,也可以通过修改配置文件完成一定的升级。
该部分是配置文件的添加的内容。
这种方式完全不需要关心对象是怎么创建的。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
<appSettings>
<add key="assName" value="thinger.Interface"/>
<add key="className" value="thinger.Interface.EquipOperationImpl"/>
</appSettings>
</configuration>
public class ObjectFactory
{
//获取程序集名称
private static string assName = ConfigurationManager.AppSettings["assName"];
/// <summary>
/// 获得接口实现类对象
/// 不需要考虑谁去使用这个对象
/// </summary>
/// <returns></returns>
public static IEquipOperation GetOperation()
{
//获取类的完全限定名
string className = ConfigurationManager.AppSettings["className"];
//使用反射,创建对象,并返回。
return (IEquipOperation)Assembly.Load(assName).CreateInstance(className);
}
}
static void Test6()
{
IEquipOperation eOperation = ObjectFactory.GetOperation();
eOperation.Start("10006");
Console.WriteLine(eOperation.Accelerate());
Console.WriteLine(eOperation.Decelerate());
eOperation.Stop();
}