C#反射机制学习
参考原文链接:https://blog.csdn.net/xiaouncle/java/article/details/52983924
反射是.NET中的重要机制,通过反射可以得到*.exe或*.dll等程序集内部的接口、类、方法、字段、属性、特性等信息,还可以动态创建出类型实例并执行其中的方法。
反射的功能很强大,任何复杂抽象的分层架构或者复杂的设计模式均是建立在这些基础之上的,比如我们要进行模块化、组件化开发,要严格的消除模块之间的耦合,要进行动态接口调用。开发这样强大而灵活的系统,必须要用反射才行,我们只要把它用在合适的位置,不仅能使代码变的清晰简洁,更能让它发挥出惊人的力量。
| 类型 | 作用 |
| Assembly | 定义和加载程序集,加载程序集清单中列出的模块,以及从此程序集中查找类型并创建该类型的实例。 |
| Module | 了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。 |
| ConstructorInfo | 了解构造器的名称、参数、访问修饰符(如public或private)和实现详细信息(如abstract或virtual)等。使用Type的GetConstructors或GetConstructor方法来调用特定的构造函数。 |
| MethodInfo | 了解方法的名称、返回类型、参数、访问修饰符(如public或private)和实现详细信息(如abstract或virtual)等。使用Type的GetMethods或GetMethod方法来调用特定的方法。 |
| FieldInfo | 了解字段的名称、访问修饰符(如public或private)和实现详细信息(如static)等,并获取或设置字段值。 |
| EventInfo | 了解事件的名称、事件处理程序数据类型、自定义特性、声明类型和反射类型等,并添加或移除事件处理程序。 |
| PropertyInfo | 了解属性的名称、数据类型、声明类型、反射类型和只读或可写状态等,并获取或设置属性值。 |
| ParameterInfo | 了解参数的名称、数据类型、参数是输入参数还是输出参数等,以及参数在方法签名中的位置等。 |
获取程序集信息
public void GetAssenblyInfo()
{
Assembly assemb = Assembly.GetExecutingAssembly();
Console.WriteLine("程序集全名称:{0}",assemb.FullName);
Console.WriteLine("程序集的版本:{0}", assemb.GetName().Version);
Console.WriteLine("程序集初始位置:{0}", assemb.CodeBase);
Console.WriteLine("程序集位置:{0}", assemb.Location);
Console.WriteLine("程序集入口:{0}", assemb.EntryPoint);
Type[] types = assemb.GetTypes();
foreach (var item in types)
{
Console.WriteLine("类: " + item.Name);
}
}
运行结果

获取类型信息
public void GetTypeInfo()
{
Type type = typeof(Strawberry);
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);
}
}
运行结果:

反射调用方法
public void InvokeMethod()
{
#region 方法一
Assembly assembly1 = Assembly.Load("ReflectionTest");
Type type1 = assembly1.GetType("ReflectionTest.Fruits.Apple");
object obj1 = System.Activator.CreateInstance(type1);
MethodInfo method1 = type1.GetMethod("Show");
method1.Invoke(obj1, null);
#endregion #region 方法二
object obj2 = Assembly.Load("ReflectionTest").CreateInstance("ReflectionTest.Fruits.Apple");
Type type2 = obj2.GetType();
MethodInfo method2 = type2.GetMethod("Show");
method2.Invoke(obj2, null);
#endregion
}
反射实现工厂模式
1. 调用抽象类
public void TestFactorMethod()
{
// 方法一
AbsFruit absFruit = FruitFactory.CreateInstance<AbsFruit>("ReflectionTest", "ReflectionTest.Fruits", "Strawberry");
absFruit.Show(); // 方法二
string fullTypeName = typeof(Strawberry).AssemblyQualifiedName;
AbsFruit absFruit2 = FruitFactory.CreateInstance<AbsFruit>(fullTypeName);
absFruit2.Show();
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace ReflectionTest.Fruits
{
abstract class AbsFruit
{
protected string Name { get; set; }
public abstract void Show();
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection; namespace ReflectionTest.Fruits
{
/// <summary>
/// 反射实现工厂模式
/// </summary>
class FruitFactory
{
/// <summary>
/// 创建实例抽象类
/// </summary>
/// <typeparam name="T">创建的实例类型</typeparam>
/// <param name="assemblyName">程序集名称</param>
/// <param name="nameSpace">程序集名称</param>
/// <param name="className">类名称</param>
/// <returns></returns>
public static T CreateInstance<T>(string assemblyName,string nameSpace, string className)
{
string fullClassName = nameSpace + "." + className;
return (T)Assembly.Load(assemblyName).CreateInstance(fullClassName);
} public static T CreateInstance<T>(string fullTypeName)
{
return (T)Activator.CreateInstance(Type.GetType(fullTypeName));
}
}
}
C#反射机制学习的更多相关文章
- JAVA反射机制—学习总结
最近收到很多关于Java反射机制的问题留言,其实Java反射机制技术方面没有太多难点,或许是大家在学习过程中遗漏了细小知识点,导致一些问题无法彻底理解,现在我们简单的总结一下,加深印象.什么是反射机制 ...
- JAVA的反射机制学习笔记(二)
上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了.自己的步伐全然被打乱了~不能继续被动下去.得又一次找到自己的节奏. 4.获取类的Constructor 通过反射机制得到 ...
- java反射机制学习小结
之前一直对java的反射机制理解得很模糊,今天因为学习spring,所以花了些时间总算把它理顺了,记录一下 另外,推荐读读这篇文章,写的挺好的http://blog.csdn.net/woshixuy ...
- java反射机制学习笔记
内容引用自:https://www.cnblogs.com/wkrbky/p/6201098.html https://www.cnblogs.com/xumBlog/p/8882489.html,本 ...
- Java反射机制——学习总结
前几天上REST课,因为涉及到Java的反射机制,之前看过一直没有用过,有些遗忘了,周末找了些资料来重新学习,现在总结一下,加深印象. 什么是反射机制? 参考百度百科对java反射机制的定义: “JA ...
- Java反射机制学习与研究
Java反射机制:可以获取正在运行时的Java对象. 1.判断运行时对象对象所属的类. 2.判断运行时对象所具有的成员变量和方法. 3.还可以调用到private方法,改变private变量的值. S ...
- Java反射机制学习
Java 反射是Java语言的一个很重要的特征,它使得Java具体了“动态性”. 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答 ...
- php反射机制学习
PHP 5 具有完整的反射 API,可以通过反射机制来获取类,接口,函数的详细信息.例如可以通过反射api的成员属性,成员方法,命名空间的名称,检测某个类是否为抽象类等操作.(欢迎指点) 一般用途是在 ...
- C#反射机制学习总结
反射的定义:审查元数据并收集关于它的类型信息的能力.元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等. Syste ...
- JAVA反射机制学习随笔
JAVA反射机制是用于在运行时动态的获取类的信息或者方法,属性,也可以用来动态的生成类,由于所有类都是CLASS的子类,我们可以用一个CLASS类的实例来实例化各种类 例如: Class<?&g ...
随机推荐
- 推送本地镜像到 Harbor
1.harbor没有启动 https 我本地 安装 harbor 的时候由于没有使用证书,所以将 harbor.yml https 注释掉. 2.配置docker镜像地址 比如 我的 ip 为 192 ...
- Git 浅克隆后拉取其他分支
对于已浅克隆的项目 $ git clone --depth=1 <git-repo-url> repo $ cd repo 现在浅克隆了一个Git仓库repo.但仓库里查询远程分支只有一个 ...
- 【软件工程与UML】第2章 用例图、用例文档、活动图 -- 系统的功能需求建模
目录 01.用例图 用例图的4组成 (一)参与者 (二)用例 (三)关系 表达关系的符号 泛化关系 (四)系统 其他 02.用例文档 简化的用例文档 注意事项 03.活动图 主要组件 建模活动图步骤 ...
- JDBC核心6步
1JDBC简介 java DataBase Connectivity,又称java数据库连接 是独立于任何数据库管理系统的api java提供接口规范,由各个数据库厂商提供接口的实现,厂商提供的实现封 ...
- Solon v3.0.5 发布!(Spring 生态可以退休了吗?)
Solon 框架! 新一代,面向全场景的 Java 应用开发框架.从零开始构建(非 java-ee 架构),有灵活的接口规范与开放生态. 追求: 更快.更小.更简单 提倡: 克制.高效.开放.生态 有 ...
- Qt数据库应用19-图片转pdf
一.前言 用户的需求真的是千奇百怪,刚做完不同页面横向纵向排版的需求,又来个需要图片转pdf的需求,提供静态函数直接使用. 经过这么些年的社会的毒打,我的原则是:用户是上帝和大爷,尽量站在用户的角度换 ...
- Centos7安装VNCserver,并设置为开机自启动服务的方法
参考链接: 1.How To Install and Configure VNC Remote Access for the GNOME Desktop on CentOS 7 2.Centos7作为 ...
- new idea
如何我希望将url链接作为大语言模型的输入,同时通过大模型的能力来学习与认识url网页链接中的文本.图片.语音等元素,应该怎么做? 要将URL链接作为输入来学习与识别URL中的文本.图片.语音等元素, ...
- [LC646]最长数对链
题目概述 给出 n 个数对. 在每一个数对中,第一个数字总是比第二个数字小. 现在,我们定义一种跟随关系,当且仅当 b < c 时,数对(c, d) 才可以跟在 (a, b) 后面.我们用这种形 ...
- [LC814]二叉树剪枝
题目 题目地址 分析 这道题符合递归的性质,对于当前的节点node,当且仅当其左右孩子都为不包含1的子树,且node.val=1时,node所在的子树才符合"不包含1的子树"这一定 ...