相关文章导航
Sql Server2005 Transact-SQL 新兵器学习总结之-总结
Flex,Fms3相关文章索引
FlexAir开源版-全球免费多人视频聊天室,免费网络远程多人视频会议系统((Flex,Fms3联合开发))<视频聊天,会议开发实例8>
Type是System.Reflection功能的根 (Root),也是存取Metadata的主要方法.
使用Type的成員可以取得相關資訊,例如建構函式(Constructor),方法,字段,屬性和類別的事件,以及模組和部署類別的組件(Assembly).
3種取得Type的方法:
1.靜態方法
Type.GetType()
2.運算符
typeof()
3.實例的方法GetType
Employee e=new Employee();
e.GetType()
在一般情況下我們调用的方法並传递给它们的参数,某些情况下可能希望根据用户操作动态调用方法.
通过Reflection命名空间
方法1是使用Type对象上的InvokeMember方法
方法2是使用MethodInfo对象上的Invoke方法
example:
先定義類Employee
其中有靜態屬性Data
實例屬性Name,ID
2個索引器
/// <summary>
/// 自定義類
/// </summary>
public class Employee
{
string name;
int id;
ArrayList list; 
static int data;
//instance .ctor()
public Employee( int id, String name ) 
{
this.name = name;
this.id = id;
list=new ArrayList();
this.list.Add( "001" );
this.list.Add( "002" );
}
//static .ctor()
static Employee()
{
data=119;
}
public override string ToString ()
{
return "Id="+ id.ToString() + ", Name=" + name;
}
//instance Method "add"
public string add( string key1,string key2 )
{
string result=key1+key2;
return result;
}
//static Method "add"
public static string add( string key1,string key2,string key3 )
{
return key1+key2+key3;
}
public string Name 
{
get 
return  name; 
}
set 
name = value; 
}
}
public int ID 
{
get 
return  id; 
}
set 
id = value; 
}
}
public static int Data
{
get
{
return data;
}
set
{
data=value;
}
}
/// <summary>
/// by index
/// </summary>
public string this [ int index ]
{
get
{
return list[index].ToString();
}
set
{
list[index]=value;
}
}
/// <summary>
/// by value
/// </summary>
public string this [ string values]
{
set
{
this[list.IndexOf(values)]=value;
}
}
}
動態調用:
定義變量
string result=String.Empty;
int i;
Type t=typeof( Employee );
Employee e=new Employee(1000,"no 1000");
方法1是使用Type对象上的InvokeMember方法:
先動態調用類Employee的實例方法ToString
InvokeMember方法的第一個參數是要調用的方法名稱
第2個參數是位枚舉,代表搜尋的方式
第四個參數是要調用的對象,要是靜態的就用null
第五個參數是要傳送給ToString的數值,由於ToString方法是無參方法,這裡我們送一個空數組new object[]{}
1             //call instance Method "ToString"
2             result=(typeof(Employee).InvokeMember("ToString",
3                                                     BindingFlags.InvokeMethod,    
4                                                     null,
5                                                     e,    
6                                                     new object[]{})).ToString();
7             Console.WriteLine("instance Method 'ToString' result={0}", result );
再動態調用類Employee的實例方法add,靜態方法add
注意InvokeMember方法的第5個參數代表的是要傳送給add方法的數值
第8個參數代表的是add方法的參數名稱
//call instance Method "add"
result=typeof(Employee).InvokeMember("add",
BindingFlags.InvokeMethod,
null,
e,
new object[]{"o1","o2"},
null,
null,
new string[]{"key1","key2"}).ToString();
Console.WriteLine("instance Method 'add' result={0}", result );
//call static Method "add"
result=typeof(Employee).InvokeMember("add",
BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public ,
null,
null,
new object[]{"o1","o2","o3"},
null,
null,
new string[]{"key1","key2","key3"}).ToString();
Console.WriteLine("static Method 'add' result={0}",result );
Console.WriteLine();
再修改靜態屬性Data,把它從119修改為911
1             //call static Property
2             i=(int)typeof(Employee).InvokeMember("Data",
3                                                 BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Static,
4                                                 null,
5                                                 null,
6                                                 new object[]{});
7             Console.WriteLine("static Property 'Data'={0}", i );
9             //update static Property
10             typeof(Employee).InvokeMember("data",
11                                             BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Static,
12                                             null,
13                                             null,
14                                             new object[]{911});
15             Console.WriteLine("update static Property ");
16 
17             //call static Property
18             i=(int)typeof(Employee).InvokeMember("Data",
19                                                 BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Static,
20                                                 null,
21                                                 null,
22                                                 new object[]{});
23             Console.WriteLine( "again call static Property 'Data'={0}",i );
24             Console.WriteLine();
25 
再修改實例屬性Name,把它從no 1000修改為w
1             //read instance Property
2             result=typeof(Employee).InvokeMember("Name",
3                                                 BindingFlags.GetProperty ,
4                                                 null,    
5                                                 e,    
6                                                 new object[]{}).ToString();
7             Console.WriteLine( "instance Property 'Name'={0}", result );
9             //update instance property
10             typeof(Employee).InvokeMember("name", 
11                                             BindingFlags.SetField | BindingFlags.NonPublic  | BindingFlags.Instance    ,
12                                             null,
13                                             e,
14                                             new object[]{"w"});
15             Console.WriteLine("update instance property ");
16             
17             //again call read instance Property
18             result=typeof(Employee).InvokeMember("Name",
19                                                     BindingFlags.GetProperty ,
20                                                     null,    
21                                                     e,
22                                                     new object[]{}).ToString();
23             Console.WriteLine( "again call instance Property 'Name'={0}", result );
24             Console.WriteLine();
25 
再修改索引器,把索引器的第2個(index[1])內容修改為222
注意修改索引器的InvokeMember方法,第5個參數的數組new object[]{"002","222"}
将要设置元素的索引值放在对象数组的第一个元素中,将要设置的值作为第二个元素
1             //call index[1] 
2             result=typeof(Employee).InvokeMember("Item",
3                                                     BindingFlags.GetProperty,
4                                                     null,
5                                                     e,
6                                                     new object[]{1}).ToString() ;
7             Console.WriteLine("index[1]={0}", result);
9             //update  index[1] 
10             typeof(Employee).InvokeMember("Item",
11                                             BindingFlags.SetProperty,
12                                             null,    
13                                             e,
14                                             new object[]{"002","222"});
15             Console.WriteLine("update  index[1] ");
16 
17             //again call index[1]
18             result=typeof(Employee).InvokeMember("Item",
19                                                 BindingFlags.GetProperty,
20                                                 null,
21                                                 e,
22                                                 new object[]{1}).ToString() ;
23 
24             Console.WriteLine("again call index[1]={0}", result);
25             Console.WriteLine();
26 
調用構造器
InvokeMember方法的第1個參數為空字符""
1             //call instance .ctor()
2             Employee employee=(Employee)typeof(Employee).InvokeMember("",
3                                                                         BindingFlags.CreateInstance,
4                                                                         null,
5                                                                         null,
6                                                                         new object[]{123,"no 123"});
7             
8             Console.WriteLine(employee.ToString());
9             Console.WriteLine();
方法2是使用MethodInfo对象上的Invoke方法:
1             //call Instance Method 'add'
2             MethodInfo methodInfo1=t.GetMethod("add",BindingFlags.Instance | BindingFlags.Public);
3             //Instance Method,first parameter is one Instance 
4             result=methodInfo1.Invoke(new Employee(1,"") ,new object[]{"key1","key2"}).ToString();
5             Console.WriteLine("call Instance Method 'add' result={0}",result);
7             //call Static Method 'add'
8             MethodInfo methodInfo2=t.GetMethod("add",BindingFlags.Static | BindingFlags.Public);
9             //Static Method,first parameter is Null 
10             result=methodInfo2.Invoke(null,    new object[]{"key1","key2","key3"}).ToString();
11             Console.WriteLine("call Static Method 'add' result={0}",result);
12 
結果圖片:
收藏与分享
收藏到QQ书签 添加到百度搜藏 添加到百度搜藏 添加到雅虎收藏 分享到饭否 收藏到就喜欢网络收藏夹 
RSS订阅我 什么是RSS?
feedsky    http://wap.feedsky.com/aierongrss    E-mail 
订阅到雅蛙        使用RSS邮天下订阅    订阅到有道阅读 
订阅到抓虾    鲜果阅读器订阅图标    Add to Google 
訂閱 Bloglines    哪吒提醒    Subscribe in NewsGator Online
东莞.net俱乐部
东莞.net俱乐部 欢迎您的加入
我的系列文章
A.Sql Server2005 Transact-SQL 新兵器学习 
B.MCAD学习 
C.代码阅读总结 
D.ASP.NET状态管理 
E.DB(数据库) 
F.WAP 
G.WinForm 
H.Flex
我的好文推荐
FlexAir开源版-全球免费多人视频聊天室,免费网络远程多人视频会议系统((Flex,Fms3联合开发))<视频聊天,会议开发实例8> 
Sql Server2005 Transact-SQL 新兵器学习总结之-总结 
MS SQL数据库备份和恢复存储过程(加强版本) 
sql server中分布式查询随笔(链接服务器(sp_addlinkedserver)和远程登录映射(sp_addlinkedsrvlogin)使用小总结) 
ASP.NET2.0国际化/本地化应用程序的实现总结(多语言,多文化页面的实现) 
WAP开发资料站(最新更新) 
自定义格式字符串随笔 (IFormattable,IFormatProvider,ICustomFormatter三接口的实现) 
Mcad学习笔记之异步编程(AsyncCallback 委托,IAsyncResult接口,BeginInvoke方法,EndInvoke方法的使用小总结) 
Mcad学习笔记之通过反射调用類的方法,屬性,字段,索引器(2種方法) 
Mcad学习笔记之序列化(2进制和Soap序列 化) 
Mcad学习笔记之委托再理解(delegate的构造器,BeginInvoke,EndInvoke,Invoke4个方法的探讨) 
ASP.NET状态管理之一(概括篇) 
Flex,Fms学习笔记
本文转自aierong博客园博客,原文链接:http://www.cnblogs.com/aierong/archive/2005/10/27/263166.html,如需转载请自行联系原作者

Mcad学习笔记之通过反射调用類的方法,屬性,字段,索引器(2種方法)相关推荐

  1. Mcad学习笔记之Microsoft Windows服务

    相关文章导航 Sql Server2005 Transact-SQL 新兵器学习总结之-总结 Flex,Fms3相关文章索引 FlexAir开源版-全球免费多人视频聊天室,免费网络远程多人视频会议系统 ...

  2. Mcad学习笔记之委托再理解(delegate的构造器,MulticastDelegate,BeginInvoke,EndInvoke,Invoke4个方法的探讨)...

    相关文章导航 Sql Server2005 Transact-SQL 新兵器学习总结之-总结 Flex,Fms3相关文章索引 FlexAir开源版-全球免费多人视频聊天室,免费网络远程多人视频会议系统 ...

  3. python3.4学习笔记(二十一) python实现指定字符串补全空格、前面填充0的方法

    python3.4学习笔记(二十一) python实现指定字符串补全空格.前面填充0的方法 Python zfill()方法返回指定长度的字符串,原字符串右对齐,前面填充0. zfill()方法语法: ...

  4. 《Spring技术内幕》学习笔记17——Spring HTTP调用器实现远程调用

    1.Spring中,HTTPInvoker(HTTP调用器)是通过基于HTTP协议的分布式远程调用解决方案,和java RMI一样,HTTP调用器也需要使用java的对象序列化机制完成客户端和服务器端 ...

  5. Go核心开发学习笔记(廿九) —— 反射

    反射使用的地方 序列化和反序列化时,如果希望序列时将结构体字段名称大写转换成小写,json:"xxx" 这里就用到了反射. 两个匿名函数变量,定义一个适配器函数用作统一处理接口: ...

  6. Go 学习笔记(35)— Go 接口 interface (接口声明、接口初始化、接口方法调用、接口运算、类型断言、类型查询、空接口)

    1. 接口概念 接口是双方约定的一种合作协议.接口实现者不需要关心接口会被怎样使用,调用者也不需要关心接口的实现细节.接口是一种类型,也是一种抽象结构,不会暴露所含数据的格式.类型及结构. 接口内部存 ...

  7. Mcad学习笔记之异步编程(AsyncCallback委托,IAsyncResult接口,BeginInvoke方法,EndInvoke方法的使用小总结)...

    收藏地址  http://aierong.cnblogs.com/archive/2005/05/25/162308.html 让我们来看看同步异步的区别: 同步方法调用在程序继续执行之前需要等待同步 ...

  8. Mcad学习笔记之异步编程(AsyncCallback委托,IAsyncResult接口,Begin

    http://www.chenjiliang.com/Article/View.aspx?ArticleID=2071 让我们来看看同步异步的区别:  同步方法调用在程序继续执行之前需要等待同步方法执 ...

  9. 【黑马程序员】 学习笔记 - Java新技术 - 反射

    ----------------------android培训.java培训.期待与您交流!---------------------- Java新技术- 反射 反射就是把Java类中的各种成分映射成 ...

最新文章

  1. 大型企业门户网站设计开发一般性原则和建议
  2. UML学生成绩管理系统需求分析
  3. android 按钮 菜单,(期末要考啊)Android的menu(菜单)按钮的使用
  4. $.ajax()方法
  5. 虚拟机禅道服务器ip,Linux系统(虚拟机)安装禅道
  6. linux普通用户id一般是,实际用户ID和有效用户ID (一) *****
  7. [读史思考]北宋历史上几个外行项目经理
  8. 一文看尽 6篇 CVPR2021 伪装目标检测、旋转目标检测论文
  9. 消防工程师 8.2 防排烟系统-防烟
  10. Scratch 飞机对战
  11. 【面试】AI常见的面试问题
  12. WAP 2.0 VS WEB 2.0
  13. 数据库系统概论整理(Part Ⅰ)
  14. KAZE FEATURES
  15. SCIENCE ADVANCES | 精神分裂症患者肠道微生物组调节小鼠谷氨酸-谷氨酰胺-GABA循环和精神分裂症相关行为
  16. SPARQL:Jena搭建SPARQL查询RDF数据
  17. 【jar】Java Runtime recognizes class file versions up to 52.0
  18. memory compression如何关闭
  19. Linux之shell注释
  20. Android Studio 快捷键

热门文章

  1. 单片机c语言表达式与的关系,单片机c语言教程第七章--运算符和表达式(关系运算符)...
  2. 微信运动刷步实践教程
  3. 关于摄影的若干个命题
  4. 写出林俊杰《黑夜问白天》歌词
  5. 中国县城生活实录:上楼因特网,下楼码长城
  6. 开源中国源码学习UI篇(一)之FragmentTabHost的使用分析
  7. html position与z-index定位学习
  8. 去哪儿网校园招聘笔试题(成都)--之一
  9. 【转】[中级]我对『PID算法』的理解 —— 原理介绍
  10. 第一次发文-汽车数字液晶仪表盘制作-嵌入式开发板-qt-linux-can总线-mcp2515模块-汽车obd