C#反射

本文介绍了C#反射的基本概念和使用,包括如何获取类的命名空间、名称、属性及方法,并展示了如何利用反射动态实例化对象。通过示例代码详细解析了Activator.CreateInstance()方法在有无无参构造函数情况下的不同行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C#反射

今天没事研究了一下c#反射的内容 , 给你们分享一下 反射入门
概念: 反射 就是程序运行时 可以动态获取类的相关信息 比如 类的字段 方法 方面名称 命名空间等 。
反射用到的命名空间:
这里写图片描述
我测试 不引入命名空间 System. Type 也可以进行反射演示 好了 废话不多说了 我们直接程序

Demo

打开vs2012 建立一个控制台程序TestReflection
在这个控制台程序添加一个类库 类库的名字是Model
这里写图片描述
好了 这个类是我们来做测试的 请先记住命名空间 属性名称 以及方法名

好了 现在我们一起看一下 主函数中的代码

namespace TestReflection
{
    class Program
    {
        static void Main(string[] args)
        {
            Assembly ass =Assembly.LoadFrom("Student.dll");
            Type[]   type=ass.GetTypes();
        }
    }
}

我们来看一下 主函数中 的 Assembly ass =Assembly.LoadFrom(“Student.dll”);代码是什么意思;
看到这行代码 是神马玩意??? 没有见过啊
传的参数Student.dll这又是什么 ,不知道没有关系 我们一起来看一下 c#编译之后是什么 ,首先我们找到项目的路径在文件中打开Student这个类里面的obj/Debug/
这里写图片描述

看到了吗 这个dll文件就是 Student编译之后的dll文件 (这点 和java不一样 java是编译之后是个class文件 然后之后可以生成jar文件 来共开发者使用)
好了不说废话了 继续 go on
Assembly 这个类就是就是封装了这个编译之后的类的相关属性
Assembly 中文意思是装配 哈哈 英语好的 是不是 很有帮助啊
注意:Student.dll这个文件要把他复制到你的主函数文件夹的bin目录下 不然会报错 这里写图片描述
这个类中有个GetTypes()这个方法 这个方法把类的属性 方法 等有封装在这个属性中 相当于做了一次类型转换 。
好了 我们现在利用Type这个类获取我们自定义类的一些属性 和方法
首先 我们先获取 类的 命名空间
string name = type[0].Namespace; 把这句加到主函数中
结果:
这里写图片描述
下面我们来看一下 获取类的名称
string name = type[0].Name;
结果:
这里写图片描述
下面我们来看一下 获取类中所有属性

PropertyInfo[] info = null;
foreach (Type t in type)
{
info= t.GetProperties();
}
foreach (PropertyInfo s in info)
{
Console.WriteLine(s);
}

GetProperties(); 这个方法是返回类的所有属性 返回值类型是PropertyInfo[]
这里写图片描述
PropertyInfo[]这类数组是封装了 反射得到的类的属性 集合
得到所有的方法 和这个类似 我们直接把代码贴出来你们参考下
MethodInfo[] info = null;
foreach (Type t in type)
{
info = t.GetMethods();
}
foreach (MethodInfo s in info)
{
Console.WriteLine(s);
}

看下结果:
这里写图片描述
这里列出的方法 除了类中的方法 还有几个是继承object这个类的方法
说了这么多 还没有到重点呢 , 神马玩意 说了这么多还没有到重点 , 现在 我们一起来看一下 利用反射实例化对象 一般我们实例化对象就是利用new关键字 现在我们不用这个 来进行实例化 下面看代码
我们在开始实例化之前我们在来认识一个类 Activator 这个类
这个类是获取远程对象的引用 我个人认为 这个就是把反射得到的类对象进行激活)
Activator这个类里面有个方法CreateInstance(); 这个方法就是创建对象用的 我们一起来看代码

Type classname = null;
foreach (Type t in type)
{
if (t.Name == "Student")
{
classname = t;
}
}
object obj = Activator.CreateInstance(classname);

这里写图片描述
看下 成功调用了 类中无参构造方法 这个就是利用反射进行实例化的对象

我们来看下类中没有无参构造函数 会是什么样子的 直接给你们结果
这里写图片描述
居然没有报错?? 但是我们不能创建对象了??这是为什么呢、?? 原来反射得到类的对象 类中必须要有无参构造 (这一点和java一样 但是java没有无参构造 会报错 c#居然不会报错 我还以为C#也会报错呢 看来是我多想了 哈哈)

  Type classname = null;
            foreach (Type t in type)
            {
                if (t.Name == "Student")
                {
                    classname = t;
                }


            }
            object obj = Activator.CreateInstance(classname);

            Console.WriteLine(type);
            MethodInfo[] info = null;
            foreach (Type t in type)
            {
                info = t.GetMethods();
            }
            foreach (MethodInfo s in info)
            {
                Console.WriteLine(s);

            }
            //调用Query方法
        MethodInfo   method= classname.GetMethod("Query");
//执行方法
method.Invoke(obj, null);




这里写图片描述

看倒数第二行 是不是成功调用方法了 ~~~~~~~
好了 反射 我们就先讲到这里 关于反射 我会在以后在更新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值