C#反射机制

1、定义
反射是.NET中的重要机制,通过反射,可以在运行时获得程序或程序集中每一个类型(包括类、结构、委托、接口和枚举等)的成员和成员的信息。
有了反射,即可了解类型,还可以创建实例对象,调用类型中的方法等。
2、命名空间
反射用到的命名空间:
System.Reflection
3、常用的类
1)Assembly:加载程序集
2)ConstructorInfo:了解构造函数相关的信息
3)MethodInfo:了解方法相关的信息
4)ParameterInfo:了解参数相关信息
5)FildInfo:了解字段相关信息
6)EventInfo:了解事件相关信息
7)PropertyInfo了解属性相关信息

4、常用类型及方法总结
Assembly:加载程序集
方式一:动态库名
Assembly assembly = Assembly.Load(“Cities”)
方式二:动态库路径
string dllPath = @“F:\RevitProject\Cities\Cities\bin\Debug\Cities.dll”;
Assembly assembly = Assembly.LoadFrom(dllPath);

加载完程序集,接下来可以了解程序集中包含的类型信息
Type[] types = assembly.GetTypes();
assembly.GetType(typeName);//注意使用类的全名,即包含命名空间的类名

取得了所需的类型,接下来可以创建类型实例,有两种方式;
方式一:
object obj = Activator.CreateInstance(type,null);//其中参数1是类型,参数二是构造函数所需参数
方式二:通过得到构造方法,来创建对象
ConstructorInfo ci = t.GetConstructor(pt); //根据参数类型获取构造函数
object[] paras = new object[2]{“Hello”,“World”}; //构造Object数组,作为构造函数的输入参数 构造函数有两个string类型的参数
object o = ci.Invoke(paras); //调用构造函数生成对象
((NewClassw)o).show(); //调用实例对象的show方法

取得类型所包含的方法,有两种方法
MethodInfo method = type.GetMethod(“DelicousFood”);//已经方法名称
MethodInfo[] methods = type.GetMethods();//可以遍历方法

方法的调用:
无参方法的调用:
method.Invoke(obj,null);
有参数方法的调用:
object[] paras = new object[2] { “Yantai”,32};
method2.Invoke(obj,paras);

下面是我的一个简单测试:
首先创建了一个 一个类库项目:目的生成.dll文件
在这里插入图片描述
代码如下:
创建Workor.cs

 public abstract class Workor
{
    public abstract void Work();
}

创建Doctor.cs

public class Doctor : Workor
{
    string name;
    public Doctor()
    {
        name = "Doctor";
        Console.WriteLine("构造函数被调用");
    }
    public override void Work()
    {
        Console.WriteLine("Job is " + name);
    }

    public void Infor(string add,int age)
    {
        Console.WriteLine( name + "住在 " + add + ",年龄" + age);
    }
}

编译生成动态库文件

新建控制台应用程序

using System;
using System.Reflection;

namespace AssemblyDemo
{
class Program
{
    static void Main(string[] args)
    {
        try
        {
            //测试以动态库文件路径的方式,加载动态库文件
            string dllPath = @"F:\RevitProject\LibararyDemo\LibararyDemo\bin\Debug\LibararyDemo.dll";
            Assembly ass = Assembly.LoadFrom(dllPath);

            /*
            Type[] types = ass.GetTypes();
            Console.WriteLine(types.Count().ToString());
            */
            Type type = ass.GetType("LibararyDemo.Doctor");
            Console.WriteLine(type.Name);

            //创建类型对象
            object obj = Activator.CreateInstance(type, null);

            //取得类型中的方法,调用不含参数的方法
            MethodInfo method = type.GetMethod("Work");
            method.Invoke(obj,null);

            //调用含参的方法
            MethodInfo method2 = type.GetMethod("Infor");
            object[] paras = new object[2] { "Yantai",32};
            method2.Invoke(obj,paras);
      	 }
        catch (Exception excption)
        {
            Console.WriteLine("Excption:" + excption.Message);
        }
    }
}

}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值