C#知识点-反射
一、开发环境
操作系统:Win7
编译器:VS2010
.net版本:.net4.0
二、项目结构
三、开发流程
0.编写实体类
namespace ReflectDemo
{
public class Bird
{
public string _id; public string Name { get; set; } public int Age { get; set; } public void Eat()
{
Console.WriteLine("我是个吃货");
} public void Eat(string birdName)
{
Console.WriteLine("我和" + birdName + "都是个吃货");
} public Bird()
{ } public Bird(string name, int age)
{
this.Name = name;
this.Age = age;
} public void BirdIntroducion()
{
Console.WriteLine("我叫" + Name + ",我" + Age + "岁了");
}
}
}
1.获取Assembly对象
namespace ReflectDemo
{
public class GetAssembly
{
public void MethodGetAllAssembly()
{
//获取当前应用程序域中的Assembly
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
Console.WriteLine(assemblies.ToString());
} public void MethodGetCurrentObjAssembly()
{
//获取当前对象所在的Assembly
Assembly assembly = this.GetType().Assembly;
Console.WriteLine(assembly.ToString());
} public void MethodGetFromBin()
{
//获取bin目录下的指定Assembly
Assembly assembly = Assembly.LoadFrom("ReflectDemo.exe");
Console.WriteLine(assembly.ToString());
}
}
}
2.获取Type对象
namespace ReflectDemo
{
public class GetType
{
public void MethodGetByClassName()
{
//通过类名获得Type
Type type = typeof(Bird);
Console.WriteLine(type.ToString());
} public void MethodGetByObjName()
{
//通过对象名获得Type
Bird bird = new Bird();
Type type = bird.GetType();
Console.WriteLine(type.ToString());
} public void MethodGetByFullName()
{
//通过 命名空间.类名获取
Assembly assembly = this.GetType().Assembly;
Type type = assembly.GetType("ReflectDemo.Bird");
} public void MethodGetAll()
{
//获取Assembly中所有的类型
Assembly assembly = this.GetType().Assembly;
Type[] types = assembly.GetTypes();
} public void MethodGetAllPublic()
{
//获取Assembly中定义的所有public类
Assembly assembly = this.GetType().Assembly;
Type[] types = assembly.GetExportedTypes();
}
}
}
3.获取Type成员对象
3.1获取字段信息
namespace ReflectDemo
{
public class GetFieldInfo
{
public void MethodGetPublicField()
{
Bird bird = new Bird()
{
_id = "1"
};
Type type = bird.GetType();
FieldInfo idInfo = type.GetField("_id");
string id = idInfo.GetValue(bird).ToString();
Console.WriteLine(id);
idInfo.SetValue(bird, "2");
string newId = bird._id;
Console.WriteLine(newId);
}
}
}
3.2获取属性信息
namespace ReflectDemo
{
public class GetPropertyInfo
{
public void MethodGetAllPublic()
{
Bird bird = new Bird()
{
Name = "小黄"
};
Type type = bird.GetType();
PropertyInfo nameInfo = type.GetProperty("Name");
string name = nameInfo.GetValue(bird, null).ToString();
Console.WriteLine(name);
nameInfo.SetValue(bird, "小黄黄", null);
Console.WriteLine(bird.Name);
}
}
}
3.3获取方法信息
namespace ReflectDemo
{
public class GetMethodInfo
{
public void MethodGetWithNoParas()
{
Bird bird = new Bird();
Type type = bird.GetType();
MethodInfo eatMethodInfo = type.GetMethod("Eat", new Type[] { });
eatMethodInfo.Invoke(bird, null);
} public void MethodWithParas()
{
Bird bird = new Bird();
Type type = bird.GetType();
MethodInfo eatMethodInfo = type.GetMethod("Eat", new Type[] { typeof(string) });
eatMethodInfo.Invoke(bird, new object[] { "小黑" });
}
}
}
3.4获取构造函数
namespace ReflectDemo
{
public class GetConstructorInfo
{
public void MethodGetActivator()
{
Type type = typeof(Bird);
Bird bird = Activator.CreateInstance(type, new object[] { "小白", 3 }) as Bird;
bird.BirdIntroducion();
} public void MethodGetConstructor()
{
Type type = typeof(Bird);
ConstructorInfo ctor = type.GetConstructor(new Type[] { typeof(string), typeof(int) });
Bird bird = ctor.Invoke(new object[] { "小黑", 5 }) as Bird;
bird.BirdIntroducion();
}
}
}
4.编写控制台程序
namespace ReflectDemo
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("---获取Assembly---");
GetAssembly getAssembly = new GetAssembly();
getAssembly.MethodGetAllAssembly();
getAssembly.MethodGetCurrentObjAssembly();
getAssembly.MethodGetFromBin(); Console.WriteLine("\n---获取Type对象---");
GetType getType = new GetType();
getType.MethodGetByClassName();
getType.MethodGetByObjName();
getType.MethodGetByFullName();
getType.MethodGetAll();
getType.MethodGetAllPublic(); Console.WriteLine("\n---获取字段信息---");
GetFieldInfo getFieldInfo = new GetFieldInfo();
getFieldInfo.MethodGetPublicField(); Console.WriteLine("\n---获取属性信息---");
GetPropertyInfo getPropertyInfo = new GetPropertyInfo();
getPropertyInfo.MethodGetAllPublic(); Console.WriteLine("\n---获取方法信息---");
GetMethodInfo getMethodInfo = new GetMethodInfo();
getMethodInfo.MethodGetWithNoParas();
getMethodInfo.MethodWithParas(); Console.WriteLine("\n---获取构造函数信息---");
GetConstructorInfo getConstructorInfo = new GetConstructorInfo();
getConstructorInfo.MethodGetActivator();
getConstructorInfo.MethodGetConstructor(); Console.ReadKey();
}
}
}
四、项目说明
1.什么是反射:
(1).在程序运行时,
动态 获取 加载程序集
动态 获取 类型(类,接口)
动态 获取 类型的成员 信息(字段,属性,方法)
(2).在运行时,
动态 创建类型实例,以及 调用 和访问 这些 实例 成员
程序集(Assembly对象)===》类,接口(Type对象)===》类的成员(**Info)
五、其他信息
C#知识点-反射的更多相关文章
- 6.C#知识点:反射
1.反射是什么? 反射提供描述组件,模块和类型的对象(类型为Type).您可以使用反射来动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型,并调用其方法或访问其字段和属性.如果您在代码中使 ...
- 跟着刚哥梳理java知识点——反射和代理(十七)
反射机制是什么?反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有的属性和方法:对于任意一个对象,都能够调用他的一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能称为java语 ...
- Java基础重要知识点-反射
反射,如何把.java文件转化为.class文件 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信 ...
- 小白也能看懂的插件化DroidPlugin原理(二)-- 反射机制和Hook入门
前言:在上一篇博文<小白也能看懂的插件化DroidPlugin原理(一)-- 动态代理>中详细介绍了 DroidPlugin 原理中涉及到的动态代理模式,看完上篇博文后你就会发现原来动态代 ...
- 反射的妙用:C#通过反射动态生成类型继承接口并实现
起因 最近想自己鼓捣个RPC,想着简化RPC调用方式,直接申明接口,然后根据接口的属性去配置RPC调用的相关信息.有一种说法叫申明式调用. 简单来说就是,申明一个interface,动态继承并实例化, ...
- Java程序员都要懂得知识点:反射
摘要:Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语 ...
- Java基础--反射机制的知识点梳理
什么是反射? 正常编译执行java文件时,会生成一个.class文件,反射就是一个反编译的过程,它可以通过.class文件得到一个java对象.一个类会有很多组成部分,比如成员变量,成员方法,构造方法 ...
- java 反射,注解,泛型,内省(高级知识点)
Java反射 1.Java反射是Java被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运行时透过Reflection APIs 取得任何一个已知名称的class的内部信息, 包括 ...
- JAVA常用基础知识点[继承,抽象,接口,静态,枚举,反射,泛型,多线程...]
类的继承 Java只支持单继承,不允许多重继承- 一个子类只能有一个父类- 一个父类可以派生出多个子类这里写图片描述子类继承了父类,就继承了父类的方法和属性.在子类中,可以使用父类中定义的方法和属性, ...
随机推荐
- Codeforces 799E(贪心)
题意: 有n个物品,购买物品i需要花费ci的代价.Arkady和Masha分别有喜欢的物品. 现在需要从中选m个,使得这m个物品中至少有k个Arkady喜欢的物品,k个Masha喜欢的物品. 输出满足 ...
- openstack setup demo 前言
我们搭建一套三节点的openstanck集群.一个controller节点,两个compute节点.操作系统采用Centos7,操作系统版本信息如下. [root@controller01 ~]# c ...
- FaceBook开源库Fresco
讨论学习使用 关于 Fresco Fresco 是一个强大的图片载入组件. Fresco 中设计有一个叫做 image pipeline 的模块.它负责从网络.从本地文件系统.本地资源载入图片. 为了 ...
- C++ auto 与 register、static keyword 浅析
[register/auto的比較分析] #include <iostream> using namespace std; int main(){ int i,sum=0; for(i=0 ...
- SUSE Linux源代码编译安装MySQL 5.6
这篇文章主要介绍了SUSE Linux下源代码编译方式安装MySQL 5.6过程分享,本文使用SUSE Linux Enterprise Server 10 SP3 (x86_64)系统,须要的朋友能 ...
- PHP + Socket 发送http请求进而实现站点灌水
本质上实现组装http信息的请求行,头信息.主题信息.參考it自学网 cookie信息和http请求头有非常大关系,注意把http请求头信息传递到函数里面 01-msg.php <?php re ...
- mongodb配置主从模式
Mongodb的replication主要有两种:主从和副本集(replica set).主从的原理和mysql类似,主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己 ...
- Weex 和 React Native 的比较看这里
写在前面 目前主流的应用大体分成三类:Native App, Web App, Hybrid App. Native App 特点: 性能好 完美的用户体验 开发成本高,无法跨平台 升级困难 (审核) ...
- bzoj 4337 树的同构
4337: BJOI2015 树的同构 Description 树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根,从根开始遍历,则其它的点都有一个前驱,这个树 ...
- P4460 [CQOI2018]解锁屏幕
算是我比较擅长的类型,自己想想就会了.普通小状压,状态傻子都能想出来.一开始裸的枚举T了,30.后来与处理之后跑的飞起,就是不对,还是30分.后来看讨论版...mod竟然是1e8+7!!!这不有毒吗. ...