理解C#反射机制
来源:互联网 发布:下载农村淘宝app乡村版 编辑:程序博客网 时间:2024/05/06 15:25
反射是.NET中的重要机制,通过反射可以得到*.exe或*.dll等程序集内部的接口、类、方法、字段、属性、特性等信息,还可以动态创建出类型实例并执行其中的方法。
反射的功能很强大,任何复杂抽象的分层架构或者复杂的设计模式均是建立在这些基础之上的,比如我们要进行模块化、组件化开发,要严格的消除模块之间的耦合,要进行动态接口调用。开发这样强大而灵活的系统,必须要用反射才行,我们只要把它用在合适的位置,不仅能使代码变的清晰简洁,更能让它发挥出惊人的力量。
反射的用途
System.Type类
System.Type类对于反射有很重要的作用。它是一个抽象的基类,Type有与每种数据类型对应的派生类,我们使用这个派生类的对象的方法、字段、属性来查找有关该类型的所有信息。
获取给定类型的Type值有三种常用方式:
- 使用C# typeof运算符
Type t=typeof(string); - 使用对象的GetType()方法
string s=”guo”;Type t=s.GetType(); - 调用Type类的静态方法GetType()
Type t=Type.GetType(“System.String”);
获取程序集信息
namespace ReflectionTest{ class ReflectionHelper { public void GetAssemblyInfo() { Assembly assembly = Assembly.GetExecutingAssembly(); Console.WriteLine("程序集全名:{0}", assembly.FullName); Console.WriteLine("程序集的版本:{0}", assembly.GetName().Version); Console.WriteLine("程序集初始位置:{0}", assembly.CodeBase); Console.WriteLine("程序集位置:{0}", assembly.Location); Console.WriteLine("程序集入口:{0}", assembly.EntryPoint); Type[] types = assembly.GetTypes(); Console.WriteLine("程序集中包含的类型:"); foreach (Type item in types) { Console.WriteLine("类:" + item.Name); } } }}
获取类型信息
namespace ReflectionTest{ class ReflectionHelper { public void GetTypeInfo() { Type type = typeof(Person); Console.WriteLine("类型名:{0}", type.Name); Console.WriteLine("类全名:{0}", type.FullName); Console.WriteLine("命名空间:{0}", type.Namespace); Console.WriteLine("程序集名:{0}", type.Assembly); Console.WriteLine("模块名:{0}", type.Module); Console.WriteLine("基类名:{0}", type.BaseType); Console.WriteLine("是否类:{0}", type.IsClass); Console.WriteLine("类的公共成员:"); MemberInfo[] members = type.GetMembers(); foreach (MemberInfo memberInfo in members) { Console.WriteLine("{0}:{1}", memberInfo.MemberType, memberInfo); } } }}
反射调用方法
namespace ReflectionTest{ class ReflectionHelper { public void InvokeMethod() { #region 方法一 Assembly assembly1 = Assembly.Load("ReflectionTest"); Type type1 = assembly1.GetType("ReflectionTest.Person"); object obj1 = System.Activator.CreateInstance(type1); MethodInfo method1 = type1.GetMethod("Show"); method1.Invoke(obj1, null); #endregion #region 方法二 object obj2 = Assembly.Load("ReflectionTest").CreateInstance("ReflectionTest.Person"); Type type2 = obj2.GetType(); MethodInfo method = type2.GetMethod("Show"); method.Invoke(obj2, null); #endregion } }}
反射实现工厂模式
namespace ReflectionTest{ class Program { static void Main(string[] args) { //方法一 AbsFruit absFruit = FruitFactory.CreateInstance<AbsFruit>("ReflectionTest", "Strawberry"); absFruit.Show(); //方法二 //string fullTypeName = typeof (Strawberry).FullName; string fullTypeName = typeof (Strawberry).AssemblyQualifiedName; AbsFruit absFruit2 = FruitFactory.CreateInstance<AbsFruit>(fullTypeName); absFruit2.Show(); } }}namespace ReflectionTest{ public class FruitFactory { public static T CreateInstance<T>(string nameSpace,string className) { string fullClassName = nameSpace + "." + className; return (T)Assembly.Load(nameSpace).CreateInstance(fullClassName); } public static T CreateInstance<T>(string fullTypeName) { return (T)Activator.CreateInstance(Type.GetType(fullTypeName)); } }}public abstract class AbsFruit{ protected string Name { get; set; } public abstract void Show();}class Strawberry:AbsFruit{ public Strawberry() { Name = "草莓"; } public override void Show() { Console.WriteLine("水果类型:" + Name); }}
1 0
- 理解C#反射机制
- 如何理解C#中的反射机制
- C#中反射机制的理解
- 对c# 反射机制的理解
- 反射机制理解
- java反射机制理解
- 反射机制的理解
- 理解JAVA反射机制
- java反射机制理解
- JAVA反射机制理解
- Java 反射机制理解
- 初步理解反射机制
- 深度理解反射机制
- Java反射机制理解
- java反射机制理解
- 反射机制理解之一
- Java反射机制理解
- 学习反射机制 c#
- 大流量网站该怎么处理?7点==
- iOS 开发 证书--根证书/申请证书/开发(发布)证书--详解
- 网络流的网络流
- java调用https接口报错
- Linux运维班第四单元作业
- 理解C#反射机制
- JavaScript实现最简单的拖拽效果 -- 转自张鑫旭的
- 基于iOS 10、realm封装的下载器(支持存储读取、断点续传、后台下载、杀死APP重启后的断点续传等功能)
- [51nod月赛19D]石头剪刀布威力加强版
- 10.30模拟赛总结
- fatal error: 'QTKit/QTKit.h' file not found when I build OpenCV on mac
- 用jquery计算精度保留2位
- 控制EditText只能输入两位小数,且第一位不能为点,也不能出现两个点
- ejabberd开发和部署