C#使用反射机制获取类信息_百度文库

C# 中的反射与示例 假设,在 Visual Studio 中,我们创建了一个 String 的对象,当我们按 obj. 然后 Visual Studio Intelligence 显示该对象的所有属性、方法、字段等,如下图所示。​ 首先,我们需要导入 Reflection 命名空间,然后我们需要获取对象的型,一旦我们获取了对象的型,那么我们就可以去浏览元数据,即浏览方法、属性、变量等等。在这里,内容是指程序集的元数据,例如该程序集中的方法是什么、该程序集中的属性是什么、它们是公共的还是私有的等等。能将其显示在屏幕上。 阅读详情
1.用反射动态创建类实例,并调用其公有成员函数。 //新建一个类库项目,增加一个GetSum方法。 
using System;   
namespace ClassLibrary1 { 
   public class Class1    { 
      public Class1()       {       } 
      public int GetSum(int x, int y)       { 
return x + y;        }    } }   
//再另建一个项目,在项目中引用上面生成的ClassLibrary1.DLL 
  
System.Reflection.Assembly a = System.Reflection.Assembly.LoadFrom("ClassLibrary1.DLL");   
System.Type t = a.GetType("ClassLibrary1.Class1");   
//动态生成ClassLibrary1.Class类的实例 
Object theObj = System.Activator.CreateInstance(t);   
//参数信息,GetSum需要两个int参数 
System.Type[] paramTypes = new System.Type[2]; 
paramTypes[0] = System.Type.GetType("System.Int32"); paramTypes[1] = System.Type.GetType("System.Int32");   
System.Reflection.MethodInfo mi = t.GetMethod("GetSum", paramTypes);   
//参数值 
Object[] parameters = new Object[2]; parameters[0] = 3; parameters[1] = 4;   
Object returnValue = mi.Invoke(theObj, parameters);   
Console.WriteLine("ClassLibrary1.Class1.GetSum(3, 4) returns: {0}", returnValue.ToString()); 2.用反射访问类的私有成员。 
如果是C++,我们可以计算对象内成员的位置,然后偏移指针以访问类型的所有非公开成员。但是.NET对象完全受GC管理,地址根本无法得到,并且也无法通过指针调用方法。 当然... 这是一种很不值得推荐的技巧,访问非公有成员很可能破坏对象状态,造成不可预料的后果。但是无论如何,利用.NET的反射机制可以做到。 比如这样一个类: 
class MyClass { 
private string PrivateField = "Private Field"; 
protected string ProtectedField = "Protected Field"; 
private string _ProtectedProperty = "Protected Property"; protected string ProtectedProperty 




  wk_ad_begin({pid : 21});wk_ad_after(21, function(){$('.ad-hidden').hide();}, function(){$('.ad-hidden').show();});    
  





get{return _ProtectedProperty;} set{_ProtectedProperty = value;} } 
private string _PrivateProperty = "Private Property"; private string PrivateProperty { 
get{return _PrivateProperty;} set{_PrivateProperty = value;} } 
protected void ProtectedMethod() { 
Console.WriteLine("Protected Method Invoked"); } 
private void PrivateMethod() { 
Console.WriteLine("Private Method Invoked"); } } 
除了默认的构造函数,没有任何成员是公开的,但是我仍然想获取和设置Field和Property的值,以及调用那两个方法。方法是: 
MyClass mc = new MyClass(); Type t = typeof(MyClass); 
BindingFlags bf = BindingFlags.Instance | BindingFlags.NonPublic;  
// Fields 
FieldInfo fi_protected = t.GetField("ProtectedField",bf); FieldInfo fi_private = t.GetField("PrivateField",bf);  
Console.WriteLine(fi_protected.GetValue(mc)); Console.WriteLine(fi_private.GetValue(mc)); fi_private.SetValue(mc,"New Private Field"); Console.WriteLine(fi_private.GetValue(mc));  
Console.WriteLine();  
// Properties 
PropertyInfo pi_protected = t.GetProperty("ProtectedProperty", bf); PropertyInfo pi_private = t.GetProperty("PrivateProperty", bf);  
Console.WriteLine(pi_protected.GetValue(mc,null)); Console.WriteLine(pi_private.GetValue(mc,null)); pi_private.SetValue(mc,"New Private Property",null); Console.WriteLine(pi_private.GetValue(mc,null));  
Console.WriteLine();  
// Methods 
MethodInfo mi_protected = t.GetMethod("ProtectedMethod", bf); MethodInfo mi_private = t.GetMethod("PrivateMethod", bf);  
mi_protected.Invoke(mc,null); mi_private.Invoke(mc,null); 
双相机坐标系标定 工业双相机对位标定 阅读详情

相关推荐

C# 反射机制

反射是指在程序运行期间,能够获取程序集中的信息,并能够动态地创建对象、访问型的成员(如字段、属性、方法等)以及调用成员的功能。简单来说,它允许程序在运行时自我审视和操作,就如同程序拥有了一面镜子,可以看到自身的结构并进行灵活的调整。C# 中的反射机制为开发者提供了在运行时动态操作型和对象的强大能力,从基础的信息获取、对象创建与成员访问,到高级的动态代理、特性应用以及在依赖注入容器中的关键作用,反射在众多领域都有着广泛的应用。

candy的博客 1628

反射

 1.用反射动态创建实例,并调用其公有成员函数。//新建一个库项目,增加一个GetSum方法。using System; namespace ClassLibrary1{   public class Class1   {      public Class1()      {      }      public int GetSum(int

diandian82的专栏 1077

弥散圆以及最大弥散圆

1弥散圆的形成? 原本景物中的一点应该经过透镜本应该也是一点才对。但是因为离焦,球差的存在,最终成像会投影成一个光斑圆圈。越小越清晰,越大就互相干涉变得越模糊。 同时人们规定二零最大弥散圆,就是人眼能够感受清晰模糊的一个边界,直径大于它,感受到模糊;直径小于它,感受不到模糊。 下面分别是离焦(左),球差(右)。 2弥散圆大小怎么计算呢? ,f为焦距;<1> ,D为光圈有效孔径;<2> F=f/D; <3> 3条公式合并可得出: ...

camerall 3070

C# 之 利用反射获取指定的(转载)

原文链接: https://www.cnblogs.com/wangbaohui/p/6727274.html 1、假设你要反射一个 DLL 中的,并且没有引用它(即未知的型): Assembly assembly = Assembly.LoadFile(“程序集路径,不能是相对路径”); // 加载程序集(EXE 或 DLL) dynamic obj = assembly.CreateInstance(“的完全限定名(即包括命名空间)”); // 创建的实例 2、若要反射当前项目中的(即当前.

浪子花梦 6285

C#开发之——GetType方法(6.5)

一 概述 C#中GetType方法用于获取当前实例的型,返回值为System.TypeC#中GetType方法不含有任何参数,是非静态方法 使用任何对象都能直接调用该方法 <!--more--> 二 实例 创建字符串型的变量、整数型的变量以及Student的对象,并分别使用GetType方法获取型并输出 2.1 代码 <span style="color:#333333">namespace code_1 { class.

我的博客 8478

c#反射机制学习和利用反射获取信息

1、.NET可执行应用程序结构 程序代码在编译后生成可执行的应用,我们首先要了解这种可执行应用程序的结构。 应用程序结构分为应用程序域—程序集—模块—型—成员几个层次,公共语言运行库加载器管理应用程序域,这种管理包括将每个程序集加载到相应的应用程序域以及控制每个程序集中型层次结构的内存布局。 程序集包含模块,而模块包含型,型又包含成员,反射则提供了封装程序集、模块和型的对...

weixin_30478757的博客 2474

C# 反射 读取 注释,方法注释,属性注释

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace AttributeTest { [AttributeUsage(AttributeTargets.All,AllowMultiple =true)] class AttributeInfo:Attribute { p.

zq爱生活爱代码的博客 6725

百度文库下载地址

C# & .NET 技术文章下载地址   C#网络编程:http://wenku.baidu.com/view/819b150931126edb6f1a10cb.html   C#集合:http://wenku.baidu.com/view/2fff7627c281e53a5802ffec.html   C#委托、Lambda表达式:http://wenku.baidu.com/view...

weixin_33779515的博客 133

反射(Reflaction)初探

        昨天,在蓝杰很多同学一起讨论了反射的东西。大家你一言我一语就把我给整蒙了,一个简简单单的反射,弄得我稀里糊涂的,回寝后就在网上搜了两篇文章,看了别人写的文章,总算是有点头绪了。于是就自己写了一个小程序,测试了一下动态装载的东西。先来解释一下反射的概念,然后贴代码,看结果。        Java 反射机制是指Java程序可以在执行期载入,探知,使用编译期间完全未知的class...

zhaosod 364

C#通过反射获取程序集中的或者方法

获取程序集下的 1、Assembly.CreateInstance () using System; using System.Reflection; using Contoso.Libraries; namespace Contoso.Libraries { //自定义的一个Person public class Person { private string _name; public Person() { } public Pers

qq_44925667的博客 4979

C# 通过反射获取实例对象

namespace XXX5 { class A { public virtual void print() { Console.WriteLine("this is A"); } } class B : A { public override void print()

IT你我 6949

C# 反射(Reflection)

原文链接:http://www.runoob.com/csharp/csharp-reflection.html反射指程序可以访问、检测和修改它本身状态或行为的一种能力。 程序集包含模块,而模块包含型,型又包含成员。 反射则提供了封装程序集、模块和型的对象。您可以使用反射动态地创建型的实例,将型绑定到现有对象,或从现有对象中获取型。然后,可以调用型的方法或访问其字段和属性。优缺点

zhruifei的专栏 517

2、反射获取Class对象

反射获取Class对象的三种方式

Garry 342

C#中的反射

一:什么是反射 通俗来讲,反射就是我们在只知道一个对象的外部而不了解内部结构的情况下,通过反射可以使我们明确这个对象的内部实现 反射是.Net中获取运行时信息的一种方式,.Net应用程序由几个部分组成:程序集(Assembly)、模块(Module)、型(Class)。而反射提供一种编程的方式,可以在程序运行期获得这几个组成部分的相关信息 二:反射的作用 利用反射可以在不需要使用new关键词的情况下,就可以动态创建对象,使用对象 三:反射是如何实现的 反射的内部实现依赖于元数据 元数据简单来

L的博客 1万+

C#通过反射获得的实例简单实现

class GraphFactory { //DrawObject父类,name名 public static DrawObject createDrawObject(string name) { DrawObject dobect; //MultiDraw为命名空间

菜鸟博客 1957

反射机制--获取实例化对象

在上一节中,获取到了字节码文件对象,那么如何获取该字节码文件对应的Person对象呢?(仍然使用在text包下定义的Person。) 运行早期的方法: package text; public class ReflectDemo2 { public static void main(String[] args) throws ClassNotFoundException, Instan

白净垃圾桶- 1456

反射中的方法

反射基础知识

m0_51884463的博客 343

C# 反射常见用法

C# 反射常见用法 定义:     反射是.NET中的重要机制,通过反射,可以在运行时获得程序或程序集中每一个型(包括、结构、委托、接口和枚举等)的成员和成员的信息。有了反射,即可对每一个型了如指掌。另外我还可以直接创建对象,即使这个对象的型在编译时还不知...

dayanyun4518的博客 332

C#反射(通过反射的方法,获取成员,并调用成员)(通过反射更新功能)

获取引用的字段:获取所有公共字段type.GetFields();获取特定字段:type.GetField()返回当前实例的准确运行型,而不是对象。1.通过反射的方法,获取成员,并调用成员。获取引用的方法有点特别。

qq_48492162的博客 4999

C#编程,反射获取命名空间、名、方法名

1、利用反射动态加载dll using System.Reflection; Assembly asm = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory+ "/DeclareDLL/YunDouTaxLib.dll");////我们要调用的dll文件路径 //加载dll后,需要使用dll中某. Type t = asm.GetType("namespace.classname");//获取名,必须 命名空间+名 //实例化

君一席 4870

WindGrapher4.1风资源数据处理软件.zip

WindGrapher4.1风资源数据处理软件.zip

上一篇: 用cubemap,噪声图,实现水面反影反射
下一篇: 风宇冲的Logo闪亮(光亮偏移)效果shader
lynon
博客等级 码龄15年 34粉丝 55原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值