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);
看倒数第二行 是不是成功调用方法了 ~~~~~~~
好了 反射 我们就先讲到这里 关于反射 我会在以后在更新