- 浏览: 79654 次
- 性别:
- 来自: dg
文章分类
- 全部博客 (70)
- [随笔分类]DB(数据库) (18)
- c# (1)
- 实用参考代码 (1)
- 默认收藏夹 (9)
- [网站分类]6.读书区(技术书籍阅读心得、书籍推荐) (1)
- xml&web服务 (1)
- [随笔分类]Asp.net (18)
- C# BLOG (1)
- 技术仓库 (0)
- .net (1)
- 编程技巧 (1)
- [随笔分类].Net Framework (1)
- [随笔分类]程序人生(非技术) (1)
- [随笔分类]其他技术类 (1)
- [随笔分类]WAP (1)
- 收藏夹 (1)
- 其他 (1)
- DotNet技术 (4)
- [网站分类]3.非技术区(技术之外的文章,但不要涉及任何政治内容) (4)
- [网站分类]7.提问区(建议在<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>中提问) (2)
- [网站分类]1.首页原创精华.NET区(包含架构设计、设计模式)(对首页文章的要求:原创、高质量、经过认真思考并精心写作) (1)
- [随笔分类]Javascript & Css & Html (1)
最新评论
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>
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;
}
}
}
動態調用:
定義變量
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[]{}
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 );
8
再動態調用類Employee的實例方法add,靜態方法add
注意InvokeMember方法的第5個參數代表的是要傳送給add方法的數值
第8個參數代表的是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
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 );
8
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
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 );
8
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"}
将要设置元素的索引值放在对象数组的第一个元素中,将要设置的值作为第二个元素
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);
8
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個參數為空字符""
2 Employee employee=(Employee)typeof(Employee).InvokeMember("",
3 BindingFlags.CreateInstance,
4 null,
5 null,
6
发表评论
-
DataReader类访问字段的值
2004-04-30 16:36 984DataReader类访问字段的 ... -
MS SQL数据库备份和恢复存储过程
2004-05-10 15:48 1146今天闲散没有事情,就写拉数据库备份和恢复存储过程(和大家交流一 ... -
购物车中数据的存放方式
2004-06-30 15:25 1553第一次做BToC站点的购物车,总结了一下购物车中数据的存放方式 ... -
枚举转化和判断方法的总结
2005-01-10 11:19 1434定义枚举: public enum DisplayType { ... -
设计时颜色调配参考(小资料)
2005-02-23 10:03 764设计时颜色调配参考,通常在编程是要考虑页面的着色问题,在此提供 ... -
表中记录查询排序随笔(sql server中order by使用方式小总结)
2005-03-02 10:14 1151跟DB打交道,用得最多的是查询 既然查询就会有查询记录排序问题 ... -
sql server中扩展存储过程随笔(几个有用的PROCEDURE小总结)
2005-03-02 17:30 761在sql server中扩展存储过 ... -
临时表和游标的使用小总结
2005-04-25 15:22 829最近使用Db的机会比较多,现做了一些小总结: i。临时表 ...
相关推荐
Altium将原生3D PCB的ECAD与MCAD集成提升到新高度.pdf
MCAD MCSD Visual C# .NET认证考试指南
.NET 认证MCAD70-305实战百题详解 清华大学出版社 美国微软工程师张玉石编著。
技术指标MCAD.ppt
音视频-编解码-零部件分类编码与EDA和MCAD在PDM系统中的集成.pdf
#资源达人分享计划#
MCAD MCSD CSharp Certification All in One Exam Guide MCAD MCSD CSharp Certification All in One Exam Guide MCAD MCSD CSharp Certification All in One Exam Guide
MCAD-MCSD Self-Paced Training Kit305&315 MCAD-MCSD Self-Paced Training Kit305&315 MCAD-MCSD Self-Paced Training Kit305&315 MCAD-MCSD Self-Paced Training Kit305&315
MCAD-MCSD Self-Paced Training Kit306&316 MCAD-MCSD Self-Paced Training Kit306&316 MCAD-MCSD Self-Paced Training Kit306&316
基于质量守恒原理和对流扩散方程的城市大气污染模型可以在http://www.nies.go.jp/kanko/kenkyu/index-e.html中找到R-207-2012技术报告。
MCAD-MCSD Visual C# Certification all in one .rar
优化协同式 ECAD - MCAD PCB 制造流程
网络弹簧编程21 Web类的mcad编程
1 I 2008 ProduktDatenJournal 11 HAUSINTERN ECAD与MCAD设计团队之间的沟通 作者:Pawel Z. Chadzynski, Needham, USA(美国) 毫无疑问,CAD行业在帮助设计团体应对日益复杂的设计要求方面取得了巨大的成功,包括...
Visual Basic® .NET and Microsoft Visual C#® .NET MCAD/MCSD Self-Paced Training Kit: Developing Windows®-Based Applications with Microsoft® Visual Basic® .NET and Microsoft Visual C#® .NET, ...
在当今全球市场上,需要在更短时间内设计出更小、更智能产品的压力使得设计工程师必须不断重新评估和修改从概念一直到制造的整体产品设计流程。 电子技术的快速发展进一步推动了对变革的需求,一系列的革新进程...
解析“多CAD设计环境”——访PTC公司中国区MCAD技术经理钱伟勋.pdf
利用3D Layout,PCB 设计人员可以更多地参与到...三维设计不能取代与 MCAD 工程师的沟通,但可以通过减少迭代来促进沟通,缩短部分设计周期。本文章围绕 PCB 设计工具 中的三维技术,描述了充分发挥其优势的五种方法。
在当今全球市场中,设计人员受分立设计原则的过时思想所困扰。他们只想设计能够在竞争中胜出的优秀产品,而且他们只想获得一种简单易用、使自己能够专著于产品智能设计的解决方案。
MCAD可快速绘制平面机构运动简图,并运动分析、仿真和设计.建一个模型仅需用几十秒到几分钟,比用商业CAD软件建模更简单、快捷,且可重复使用调整。可供从事机械的工程师、学生、教师使用.(若不是CSDN用户,请尽可能...