目录:

一. 反射的主要特性

  1.反射中一个非常重要的类型就是 Type

    1)当没有对象的时候使用这种方式来获取某个类型的Type

    2)当已经获得对象后通过对象的GetType()方法来获取指定对象的类型的Type对象

  2.获取Person类中的所有的方法

  3.获取某个类型的所有属性

  4.获取类中的所有字段,私有字段无法获取

  5.获取所有成员,不包含私有成员

二. 反射动态加载程序集

  1.动态加载一个程序集

  2.获取刚刚加载的程序集中的所有的类型

    1)GetTypes()获取了所有的类型

    2)只获取那些public的类型

  3.获取程序集中某个类的Type

  4.动态调用类的方法

    1)调用无参数无返回值的方法

    2) 调用带参数,带返回值的方法

      1> 调用不带重载的方法

      2>调用带重载的方法

  5. 通过反射获取类的属性,并赋值

    1)获取Name属性

    2)为属性赋值

    3) 获取属性值

    4)获取方法并调用

  6.手动查找类型的构造函数,并且调用该构造函数来创建类型的对象

三. 其他的反射中的一些方法

  1. bool IsAssignableFrom(Type c) 判断当前的类型的变量是不是可以接受c类型变量的赋值

  2. bool IsInstanceOfType(object o):判断对象o是否是当前类的实例(当前类可以是o的类、父类、接口)

  3. bool IsSubclassOf(Type c):判断当前类是否是类c的子类

  4. IsAbstract 判断是否为抽象的,含接口

————————————————————————————————————————————————————————————————————————————

反射是什么?

反射:通过动态获取程序集,并获取其中的类型元数据,然后访问该类型的过程。

一. 反射的主要特性

在介绍反射的主要特性之前我们先建一个Person类(下面都是对Person类进行操作)

    class Person
{ public int _height; public string Name { get; set; }
public int Age { get; set; }
public string Email { get; set; } public void Say()
{
Console.WriteLine("Hello everyone!");
} public void SayMorning()
{
Console.WriteLine("Good morning everybody!");
} //私有的
void Do()
{
Console.WriteLine("Just do it!");
}
}

1.反射中一个非常重要的类型就是 Type

获取Person类型的Type对象(Type对象中就是存放了一些关于某个类型的所有信息的内容。[某个类型的Type对象就是该类型“类型元数据”])

获取Type对象有两种方法:

1)当没有对象的时候使用这种方式来获取某个类型的Type
Type type = typeof(Person);

2)当已经获得对象后通过对象的GetType()方法来获取指定对象的类型的Type对象
Person p = new Person();
Type personType = p.GetType();

2.获取Person类中的所有的方法

(通过Type对象的GetMethods()可以获取指定类型的所有的方法其中包括编译器自动生成的方法以及从父类中继承来的方法,但是不包含private方法)
MethodInfo[] methods = personType.GetMethods();
for (int i = 0; i < methods.Length; i++)
{
Console.WriteLine(methods[i].Name);
}

3.获取某个类型的所有属性
PropertyInfo[] properties = personType.GetProperties();
for (int i = 0; i < properties.Length; i++)
{
Console.WriteLine(properties[i].Name);
}
Console.ReadKey();

4.获取类中的所有字段,私有字段无法获取
FieldInfo[] fields = personType.GetFields();
for (int i = 0; i < fields.Length; i++)
{
Console.WriteLine(fields[i].Name);
}
Console.ReadKey();

5.获取所有成员,不包含私有成员
MemberInfo[] members = personType.GetMembers();
for (int i = 0; i < members.Length; i++)
{
Console.WriteLine(members[i].Name);
}
Console.ReadKey();

二. 反射动态加载程序集

在接收发射动态加载程序集,先把程序级的代码贴出来(下面都是对程序集TestDll.dll进行操作)

namespace TestDll
{
public class Class1
{
} class MyClass
{
public void English()
{
Console.WriteLine("Hi,English");
}
} public abstract class MyAbstractClass
{ } public static class MyStaticClass
{
} public class Person
{
public Person()
{ } public Person(string name, int age, string email)
{
this.Name = name;
this.Age = age;
this.Email = email;
} public string Name { get; set; }
public int Age { get; set; }
public string Email { get; set; } public void GetNameValue()
{
Console.WriteLine(this.Name + "--" + this.Age + "--" + this.Email);
} public void English()
{
Console.WriteLine("Hi,English");
} public void China()
{
Console.WriteLine("你好,中国");
} public int Add(int n1, int n2)
{
return n1 + n2;
} public int Add(int n1, int n2, int n3)
{
return n1 + n2 + n3;
}
} public class Student : Person, IFlyable
{
public string StudentNo { get; set; } #region IFlyable 成员 public void Fly()
{
Console.WriteLine("I can Fly!");
} #endregion
} class Teacher : Person
{ } public delegate void MyDelegate(); delegate void MyDelegate1(); public enum GoodMan
{
高,
富,

} public interface IFlyable
{
void Fly();
}
}

1.动态加载一个程序集
Assembly assembly = Assembly.LoadFile(@"D:\TestDll\bin\Debug\TestDll.dll");

注意:这个地址是程序及所在的绝对地址

2.获取刚刚加载的程序集中的所有的类型
assembly.GetType() 等价于 typeof(Assembly)
1)GetTypes()获取了所有的类型
Type[] types = assembly.GetTypes();

2)只获取那些public的类型
Type[] types = assembly.GetExportedTypes();
for (int i = 0; i < types.Length; i++)
{
Console.WriteLine(types[i].Name);
}

3.获取程序集中某个类的Type
如:只获取Person类的Type
GetType()方法有重载,选择第二个重载,参数表示是要获取的类型的“完全限定名称”,即:命名空间.类名
这里拿到了Type,其实就等价于typeof(Person)或者是:p.GetType();
Type personType = assembly.GetType("_02TestDll.Person");

获取所有的方法:personType.GetMethods();

4.动态调用类的方法

(借用上面获取的Person类的方法)

获取某个特定的方法(根据方法名):personType.GetMethod();

1)调用无参数无返回值的方法

MethodInfo method = personType.GetMethod("SayHi");
Console.WriteLine(method.Name);

//通过反射来创建一个Person类型的对象{其实就是通过Person的Type来创建一个Person对象}

object objPerson = Activator.CreateInstance(personType);

//调用这个方法
method.Invoke(objPerson, null);

2) 调用带参数,带返回值的方法

1> 调用不带重载的方法
//找到对应的方法
MethodInfo method = personType.GetMethod("Add");
object obj = Activator.CreateInstance(personType);
//调用
object result = method.Invoke(obj, new object[] { 102, 203 });
Console.WriteLine("调用Add方法的返回值结果是:{0}", result);
#endregion

2>调用带重载的方法

//找到对应的方法
MethodInfo method = personType.GetMethod("Add", new Type[] { typeof(int), typeof(int), typeof(int) });
object obj = Activator.CreateInstance(personType);

//调用
int r = (int)method.Invoke(obj, new object[] { 1, 2, 3 });
Console.WriteLine(r);

5. 通过反射获取类的属性,并赋值

(借用上面获取的Person类的方法)

1)获取Name属性
PropertyInfo property = personType.GetProperty("Name");
object obj = Activator.CreateInstance(personType);
2)为属性赋值
property.SetValue(obj, "张三", null);

3) 获取属性值
string name = property.GetValue(obj, null).ToString();
Console.WriteLine(name);

4)获取方法并调用

MethodInfo method = personType.GetMethod("GetNameValue");
method.Invoke(obj, null);
Console.ReadKey();

6.手动查找类型的构造函数,并且调用该构造函数来创建类型的对象

查找到了对应的构造函数,但是还没有调用
ConstructorInfo ctor = personType.GetConstructor(new Type[] { typeof(string), typeof(int), typeof(string) });

开始调用构造函数
object obj = ctor.Invoke(new object[] { "hpp", 16, "hpp@yahoo.com" });
Console.WriteLine(obj.ToString());

MethodInfo method = personType.GetMethod("GetNameValue");
method.Invoke(obj, null);
Console.ReadKey();

三. 其他的反射中的一些方法

//动态加载一个程序集
Assembly assembly = Assembly.LoadFile(@"D:\TestDll\bin\Debug\TestDll.dll");

//获取类的Type
Type typePerson = assembly.GetType("TestDll.Person");

Type typeStudent = assembly.GetType("TestDll.Student");

Type typeIFlyable = assembly.GetType("TestDll.IFlyable");

1. bool IsAssignableFrom(Type c) 判断当前的类型的变量是不是可以接受c类型变量的赋值

//表示可以将Student类型赋值给Person类型,因为Student类型继承自Person类
bool b = typePerson.IsAssignableFrom(typeStudent); //true

//表示可以将Student类型赋值给IFlyable类型,因为Student类型继承自IFlyable接口

bool b = typeIFlyable.IsAssignableFrom(typeStudent);//true

//表示不可以将Person类型赋值给IFlyable类型,因为Person类型没有继承IFlyable接口

bool b = typeIFlyable.IsAssignableFrom(typePerson);//false

2. bool IsInstanceOfType(object o):判断对象o是否是当前类的实例(当前类可以是o的类、父类、接口)

//Person
object objPerson = Activator.CreateInstance(typePerson);
//Student
object objStudent = Activator.CreateInstance(typeStudent);

//当前类就是Person类

bool b = typePerson.IsInstanceOfType(objPerson);//true

//Suntent类是Person类的子类

bool b = typePerson.IsInstanceOfType(objStudent);//true

//person类不是Student的子类

bool b = typeStudent.IsInstanceOfType(objPerson);//false

3. bool IsSubclassOf(Type c):判断当前类是否是类c的子类

//Person
object objPerson = Activator.CreateInstance(typePerson);
//Student
object objStudent = Activator.CreateInstance(typeStudent);

//Suntent类是Person类的子类

bool b = typeStudent.IsSubclassOf(typePerson);//true

//person类不是Student的子类

bool b = typePerson.IsSubclassOf(typeStudent);//false

//这个返回是false,只验证类与类之间的父子类关系,接口不包含。
bool b = typeStudent.IsSubclassOf(typeIFlyable);

4. IsAbstract 判断是否为抽象的,含接口

Type typeMyAbsClass = assembly.GetType("TestDll.MyAbstractClass");
Type typeMyStaticClass = assembly.GetType("TestDll.MyStaticClass");

Console.WriteLine(typePerson.IsAbstract);//false;
Console.WriteLine(typeStudent.IsAbstract);//false
Console.WriteLine(typeIFlyable.IsAbstract);//true
Console.WriteLine(typeMyAbsClass.IsAbstract);//true
Console.WriteLine(typeMyStaticClass.IsAbstract); //true
Console.ReadKey();

以上就是反射的一些介绍以及一些放大的基本用法······

C# 反射机制以及方法的更多相关文章

  1. Day16_88_通过反射机制执行方法

    通过反射机制执行方法 * method.invoke(object,"admin","123"); * 代码 import java.lang.reflect. ...

  2. 利用java反射机制对方法进行调用

    http://blog.csdn.net/coolcoffee168/article/details/5835143

  3. c#反射机制

    一:反射的定义 审查元数据并收集关于它的类型信息的能力.元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等. Sys ...

  4. C#反射机制 (转载)

    转载:原文出处      http://www.cnblogs.com/binfire/archive/2013/01/17/2864887.html 一:反射的定义 审查元数据并收集关于它的类型信息 ...

  5. Java 类反射机制分析

    Java 类反射机制分析 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某 ...

  6. C#反射机制(转)

    一:反射的定义 审查元数据并收集关于它的类型信息的能力.元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等. Sys ...

  7. C#反射机制介绍

    反射的定义:审查元数据并收集关于它的类型信息的能力.元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等.       ...

  8. Android反射机制实现与原理

    本文介绍Android反射机制实现与原理,在介绍之前,要和Java进行比较,所以先看下Java中的反射相关知识: 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或 ...

  9. c#反射机制判断同一个类的两个实例的值是否完全一样

    ; i < properties1.Length; i++)            {                string s = properties1[i].DeclaringTyp ...

随机推荐

  1. Web —— 在自己电脑搭建网站,发布到公网,并使用域名访问

    导读 闲置着一台笔记本,想拿来作为服务器来玩,先拿来发布之前的毕业设计的博客系统,百度搜出的资料玉石难辨,而且大多数前篇一律,刚开始参考了大多数资料来设置还是没能真正发布成功,最后发现原来网上大部分提 ...

  2. CF1106F Lunar New Year and a Recursive Sequence 原根、矩阵快速幂、BSGS

    传送门 好久没写数论题了写一次调了1h 首先发现递推式是一个乘方的形式,线性递推和矩阵快速幂似乎都做不了,那么是否能够把乘方运算变成加法运算和乘法运算呢? 使用原根!学过\(NTT\)的都知道\(99 ...

  3. JAVA CAS原理浅谈

    java.util.concurrent包完全建立在CAS之上的,没有CAS就不会有此包.可见CAS的重要性. CAS CAS:Compare and Swap, 翻译成比较并交换. java.uti ...

  4. Webpack 2 视频教程 007 - 配置 WDS 进行浏览器自动刷新

    原文发表于我的技术博客 这是我免费发布的高质量超清「Webpack 2 视频教程」. Webpack 作为目前前端开发必备的框架,Webpack 发布了 2.0 版本,此视频就是基于 2.0 的版本讲 ...

  5. TRIO-basic指令--九九乘法表demo

    在路上闲的没事,想到之前自己用别的语言实现乘法口诀表,于是来了兴趣用TRIO-basic试一下,挺简单的一段代码,大家看看就好. ' TRIO-basic '实现乘法口诀表 定义两个整型的局部变量 D ...

  6. Linux服务器更换主板后,网卡识别失败的处理方法

    1)现象说明公司IDC机房里的一台线上服务器硬件报警,最后排查发现服务器主板坏了,随即联系厂商进行更换主板,最后更换后,登录服务器,发现网卡绑定及ip信息都在,但是ip却ping不通了,进一步排查,重 ...

  7. redis持久化策略梳理及主从环境下的策略调整记录

    redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化.可以不定期的通过异步方式保存到磁盘上(即“半持久化模式”):也可以把每一次数据变化都写入到一个A ...

  8. java内存溢出的解决思路

    原文地址:https://www.cnblogs.com/200911/p/3965108.html 内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能 ...

  9. Nginx入门【转】

    原文地址:http://blog.csdn.net/u012486840/article/details/53098890 1.静态HTTP服务器 首先,Nginx是一个HTTP服务器,可以将服务器上 ...

  10. bootstrap面试题

    1.你能描述一下渐进增强和优雅降级之间的不同吗? 优雅降级:Web站点在所有新式浏览器中都能正常工作,如果用户使用的是老式浏览器,则代码会检查以确认它们是否能正常工作.由于IE独特的盒模型布局问题,针 ...