C#使用反射机制获取类信息[转]
当然... 这是一种很不值得推荐的技巧,访问非公有成员很可能破坏对象状态,造成不可预料的后果。但是无论如何,利用.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 :-)
C#使用反射机制获取类信息[转]的更多相关文章
- C#使用反射机制获取类信息
1.用反射动态创建类实例,并调用其公有成员函数. //新建一个类库项目,增加一个GetSum方法. using System; namespace ClassLibrary1 { publi ...
- java 中利用反射机制获取和设置实体类的属性值
摘要: 在java编程中,我们经常不知道传入自己方法中的实体类中到底有哪些方法,或者,我们需要根据用户传入的不同的属性来给对象设置不同的属性值,那么,java自带的反射机制可以很方便的达到这种目的,同 ...
- C# 中利用反射机制拷贝类的字段和属性(拷贝一个类对象的所有东西付给另一个类对象,而不是付给引用地址)
from:https://blog.csdn.net/poxiaohai2011/article/details/27555951 //C# 中利用反射机制拷贝类的字段和属性(拷贝一个类对象的所有东西 ...
- java反射机制获取自定义注解值和方法
由于工作需求要应用到java反射机制,就做了一下功能demo想到这些就做了一下记录 这个demo目的是实现动态获取到定时器的方法好注解名称,废话不多说了直接上源码 1.首先需要自定义注解类 /** * ...
- Day16_90_通过反射机制获取某个特定的构造方法
通过反射机制获取某个特定的构造方法 public class ReflectTest13 { public static void main(String[] args) throws ClassNo ...
- Day16_89_通过反射机制获取所有构造方法
通过反射机制获取某个特定的构造方法 * 代码 import java.lang.reflect.Constructor; import java.lang.reflect.Modifier; publ ...
- Day14_81_反射机制获取Class属性
反射机制获取Class属性 获取属性 方法一: Class对象 . getFields();只能用来获取公开的属性,不能获取有私有的或者受保护的属性 获取属性 方法二: Class对象 . getDe ...
- kettle job如何利用java的反射机制获取执行的sql语句
kettle job中的JavaScript如何获取同一个job中SQL步骤的执行语句并让执行语句记录在日志中呢?首先写日志需要用到job中JavaScript写日志的方法,其次是利用java反射机制 ...
- android 利用反射机制获取drawable中所有的图片资源
public List<Map<String,Object>> getGridData() { list=new ArrayList<Map<String,Obje ...
随机推荐
- 如何利用App打造自明星实现自盈利
1.了解各个概念 为了大家都能看懂这篇文章,先说明几个概念. App(Application):可以在移动设备上使用,满足人们咨询.购物.社交.娱乐.搜索等需求的一切应用程序. ...
- Selenium 报错:Element is not clickable at point
WebDriverException: unknown error: Element <td class="grid - select - input " stype=&qu ...
- python - unittest - testsuite and runner
前置条件: 测试用例部分或全部编写完成 一. 生成测试集 1. 方法1 - 通过加载函数来加载测试用例 import unittest from TestCase.test_login import ...
- day04_05 逻辑运算符、表达式
num += 1 等价于 num = num + 1 逻辑运算符 and 全true则true 条件1 and 条件2 5>3 and 3>2 ===> true 5> ...
- [git 学习篇]git管理的是修改,并非文件
你会问,什么是修改?比如你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚至创建一个新文件,也算一个修改. 为什么说Git管理的 ...
- 欧拉回路 & 欧拉路径
欧拉路径 & 欧拉回路 概念 欧拉路径: 如果图 G 种的一条路径包括所有的边,且仅通过一次的路径. 欧拉回路: 能回到起点的欧拉路径. 混合图: 既有无向边又有无向边的图. 判定 无向图 一 ...
- SQL Server 2016 KB2919355 安装失败
Windows Server 2012 R2 安装 SQL Server 2016 检查未通过,需要安装 KB2919355 . 错误如下图: 按提示,下载安装 Windows Server 2012 ...
- SpringBoot基础之MockMvc单元测试
SpringBoot创建的Maven项目中,会默认添加spring-boot-starter-test依赖.在<5分钟快速上手SpringBoot>中编写的单元测试使用了MockMvc.本 ...
- hdu 3685 多边形重心+凸包
Rotational Painting Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- Python 使用cx_freeze 生成exe文件
在python中比较常用的python转exe方法有三种,分别是cx_freeze,py2exe,PyInstaller.py2exe恐怕是三者里面知名度最高的一个,但是同时相对来说它的打包质量恐怕也 ...