C#之反射技术(Reflection)

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();

        }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值