浅谈c#中的反射(仅供入门学习参考)

前言

        反射这个概念在以Java为代表的其他语言中也有,由于本人更加熟悉C#,所以主要按C#设计来讲解

前置概念学习

  • 元数据:

        元数据是描述数据的数据。比如说你看到一只很好看的鸟,你想要给远在千里之外的家人分享,有两种做法。第一种,直接拍照发送;第二种,用足够精确的语言描述,然后对方按照你的精确语言描述想象。以上场景中,很好看的鸟就是数据本身,拍照是对数据的直接拷贝,所以也是数据,而使用的描述语言元数据(鸟的种类,颜色,眼睛大小,瞳孔颜色等等描述)。元数据的使用场景有两个特点:间接,相对准确。

  • C#中的元数据:

        我们知道C#中具有以下元素:

  • dll/exe
  • Class 
  •  Method
  •  Property 
  •  Filed
  •   ...

        平常我们写代码,写的就是直接信息。C#编译器会自动生成对应的元数据,为了让程序员能够方便操作,这些元数据也是以类型的形式对程序员暴露,C#中的数据与元数据对应关系如下。

        dll/exe:Assembly

        Class:Type

        Method:MethodInfo

        Property:PropertyInfo

        Filed:FieldInfo

//假设你在某个程序集中存在以下类型 
public class MyClass {
    private int myField;
    private int MyProperty { get; set; }
    public void MyMethod()
    {
        Console.WriteLine("执行了方法");
    }
}
//
//可以通过一下方式获取每个类型的描述信息
//
//通过文件路径加载程序集的元数据
Assembly assembly = Assembly.LoadFrom("yourFilePath");
//通过类型名称径获取类型的元数据
Type myClassType = assembly.GetType("MyClass");
//通过方法名称获取方法的元数据
MethodInfo myMethod = myClassType.GetMethod("MyMethod");
//通过属性名称获取属性的元数据
PropertyInfo MyProperty = myClassType.GetProperty("MyProperty");
//通过字段名称获取字段的元数据
FieldInfo fieldInfo = myClassType.GetField("myField");

        以上代码中我们可以发现,类型被包含在程序集当中,类型的元数据也从程序集的元数据中获取;方法包含在类型中,方法的元数据也从类型的元数据中获取。我们可以得出结论,元数据与数据具有强烈的对称性。这种对称性,可以类比于镜面反射中虚像与实物

简单用元数据赋值与方法调用

  以下为.NET FrameWork控制台程序,大家可以拷贝代码自行调试

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace ExaminationConsoleApp
{
    class Program
    {
   
        static void Main(string[] args)
        {
            //通过文件路径加载程序集的元数据
            Assembly assembly = Assembly.LoadFrom(Assembly.GetExecutingAssembly().Location);
            //通过类型名称径获取类型的元数据
            Type myClassType = assembly.GetType("ExaminationConsoleApp.MyClass");
            //通过方法名称获取方法的元数据
            MethodInfo myMethod = myClassType.GetMethod("MyMethod");
            //通过属性名称获取属性的元数据
            PropertyInfo MyProperty = myClassType.GetProperty("MyProperty");
            //通过字段名称获取字段的元数据
            FieldInfo fieldInfo = myClassType.GetField("myField");


            MyClass myClass = new MyClass();

            //正常调用方法MyMethod
            myClass.MyMethod();
            //利用方法的MyMehtod元数据调用
            myMethod.Invoke(myClass, new object[0]);


            //正常调用方法MyMethod
            myClass.MyProperty=1;
            //利用方法的MyMehtod元数据调用
            MyProperty.SetValue(myClass, 2);
        }
    }
    public class MyClass
    {
        public int myField;
        public int MyProperty { get; set; }
        public void MyMethod()
        {
            Console.WriteLine("执行了方法");
        }
    }

}

什么是反射

         文章至此,我们终于见识到了“反射”技术。那就在这里给反射下个定义吧。反射是一种利用元数据间接实现数据操作或者方法调用的技术。由于其操作总是先获取具有对称性的元数据,通过元数据来间接操作目标对象,数据与元数据如同镜面的两侧的实体与虚像,故而把该技术成为反射。 如上文中myMethod.Invoke(myClass, new object[0]);  与MyProperty.SetValue(myClass, 2);

反射的应用

        相信大家可以看出,反射的好处是给编码带来极大的灵活性,比如说我们可以类型名称和方法名称外置出去,由外界输入,即我们可以做出一个由外界用户通过发送字符串来灵活调用的程序。没错,web程序就是这样的程序。

完结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值