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
{
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);

Console.ReadLine();

输出:
Protected Field
Private Field
New Private Field

Protected Property
Private Property
New Private Property

Protected Method Invoked
Private Method Invoked
事件,一样可以操作, EventInfo :-)

原地址:http://blog.csdn.net/zhoufoxcn/article/details/1358095
 

C#使用反射机制获取类信息的更多相关文章

  1. C#使用反射机制获取类信息[转]

    http://www.cnblogs.com/zhoufoxcn/archive/2006/10/31/2515873.html 1.用反射动态创建类实例,并调用其公有成员函数. //新建一个类库项目 ...

  2. java 中利用反射机制获取和设置实体类的属性值

    摘要: 在java编程中,我们经常不知道传入自己方法中的实体类中到底有哪些方法,或者,我们需要根据用户传入的不同的属性来给对象设置不同的属性值,那么,java自带的反射机制可以很方便的达到这种目的,同 ...

  3. C# 中利用反射机制拷贝类的字段和属性(拷贝一个类对象的所有东西付给另一个类对象,而不是付给引用地址)

    from:https://blog.csdn.net/poxiaohai2011/article/details/27555951 //C# 中利用反射机制拷贝类的字段和属性(拷贝一个类对象的所有东西 ...

  4. java反射机制获取自定义注解值和方法

    由于工作需求要应用到java反射机制,就做了一下功能demo想到这些就做了一下记录 这个demo目的是实现动态获取到定时器的方法好注解名称,废话不多说了直接上源码 1.首先需要自定义注解类 /** * ...

  5. Day16_90_通过反射机制获取某个特定的构造方法

    通过反射机制获取某个特定的构造方法 public class ReflectTest13 { public static void main(String[] args) throws ClassNo ...

  6. Day16_89_通过反射机制获取所有构造方法

    通过反射机制获取某个特定的构造方法 * 代码 import java.lang.reflect.Constructor; import java.lang.reflect.Modifier; publ ...

  7. Day14_81_反射机制获取Class属性

    反射机制获取Class属性 获取属性 方法一: Class对象 . getFields();只能用来获取公开的属性,不能获取有私有的或者受保护的属性 获取属性 方法二: Class对象 . getDe ...

  8. kettle job如何利用java的反射机制获取执行的sql语句

    kettle job中的JavaScript如何获取同一个job中SQL步骤的执行语句并让执行语句记录在日志中呢?首先写日志需要用到job中JavaScript写日志的方法,其次是利用java反射机制 ...

  9. android 利用反射机制获取drawable中所有的图片资源

    public List<Map<String,Object>> getGridData() { list=new ArrayList<Map<String,Obje ...

随机推荐

  1. IDEA里面maven项目使用maven插件tomcat启动项目

    1.首先在pom.xml添加tomcat插件依赖: <?xml version="1.0" encoding="UTF-8"?> <proje ...

  2. Android 面试汇总<三>

    1.3 计算机网络 基础 Q:五层协议的体系结构分别是什么?每一层都有哪些协议? 技术点:网络模型.协议 思路:分条解释每层名字以及协议 参考回答: 物理层 数据链路层:逻辑链路控制LLC.媒体接入控 ...

  3. LoadRunner运行时异常处理

    VuGen提供了错误处理函数lr_continue_on_error,用来在脚本中实时修改Vuser的出错设置.lr_continue_on_error函数语法结构如下: Loadrunner在运行过 ...

  4. Linux下源码安装MySQL-5.6.25

    从mysql-5.5起,mysql源码安装开始使用cmake了,因此我们得先安装cmake,配置安装目录./configure --perfix=/.....的时候和以前的会有些区别. 一.安装cma ...

  5. 如何利用Prometheus监控你的应用

    Prometheus作为一套完整的开源监控接近方案,因为其诸多强大的特性以及生态的开放性,俨然已经成为了监控领域的事实标准并在全球范围内得到了广泛的部署应用.那么应该如何利用Prometheus对我们 ...

  6. 关于vtkCommand的各种事件的解释

    superclass for callback/observer methods vtkCommand is an implementation of the observer/command des ...

  7. LeetCode.1018-可被5整除的二进制数(Binary Prefix Divisible By 5)

    这是小川的第379次更新,第407篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第241题(顺位题号是1018).给定0和1的数组A,考虑N_i:从A[0]到A[i]的第 ...

  8. bat默认以管理员身份运行

    在Bat文件内容前插入以下一段代码: @echo off :: BatchGotAdmin :------------------------------------- REM --> Chec ...

  9. Akka系列(四):Akka中的共享内存模型

    前言...... 通过前几篇的学习,相信大家对Akka应该有所了解了,都说解决并发哪家强,JVM上面找Akka,那么Akka到底在解决并发问题上帮我们做了什么呢? 共享内存 众所周知,在处理并发问题上 ...

  10. 【Linux 网络编程】TCP/IP四层模型

    应用层.传输层.网络层.链路层 链路层:常用协议 ARP(将物理地址转化为IP地址) RARP(将IP地址转换为物理地址) 网络层(IP层):重要协议ICMP IP IGMP 传输层:重要的协议TCP ...