`

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

 
阅读更多

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


再動態調用類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 );
 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

 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 );
 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"}
将要设置元素的索引值放在对象数组的第一个元素中,将要设置的值作为第二个元素

 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);
 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個參數為空字符""

1             //call instance .ctor()
2             Employee employee=(Employee)typeof(Employee).InvokeMember("",
3                                                                         BindingFlags.CreateInstance,
4                                                                         null,
5                                                                         null,
6                            
分享到:
评论

相关推荐

    技术指标MCAD.ppt

    技术指标MCAD是技术分析中常用的指标之一,它可以帮助投资者捕捉股票的涨跌趋势和买卖点。MCAD指标是基于MACD(Moving Average Convergence Divergence)指标,它通过计算股票的快慢均线的差异来预测股票的涨跌趋势...

    二维交互性绘图软件包MCAD的数据结构.pdf

    MCAD系统数据结构部分详细描述了实体结点的构成,每个实体结点包含类型标识符(tag)、颜色(color)和线型(linestyle)三个属性,其中类型标识符用于区分不同类型的图形实体,颜色标识了实体的颜色,而线型描述了...

    Altium将原生3D PCB的ECAD与MCAD集成提升到新高度.pdf

    在电力电子领域,滞环电流控制是一种常见的控制策略,尤其适用于需要快速响应和良好动态性能的电力变换器和逆变器。滞环控制通过设定一个电流环宽,并与实际电流的滞环宽度进行比较,来控制开关器件的开闭,从而实现...

    MCAD MCSD Visual C# .NET认证考试指南

    2. **C#语言特性**:C#是一种面向对象的语言,支持类、接口、继承、多态等特性。学习C#的关键概念如变量、数据类型、控制流语句、异常处理以及类和对象的创建与使用。 3. **Windows Forms开发**:MCAD MCSD认证会...

    自研的平面机构可视化运动分析软件MCAD 适用于机械原理、机构学

    MCAD可快速绘制平面机构运动简图,并运动分析、仿真和设计.建一个模型仅需用几十秒到几分钟,比用商业CAD软件建模更简单、快捷,且可重复使用调整。可供从事机械的工程师、学生、教师使用.(若不是CSDN用户,请尽可能...

    JT2Go软件使用方法培训课程之PMI使用方法.pptx

    JT2Go软件使用方法培训课程之PMI使用方法 JT2Go软件是一款功能强大且用户友好的软件,主要用于查看、编辑和共享JT格式的三维模型数据。JT格式是一种开放的、公共的、可由大多数主流MCAD创建的中性3D数据格式,包含...

    .NET认证MCAD70-305实战百题详解

    .NET 认证MCAD70-305实战百题详解 清华大学出版社 美国微软工程师张玉石编著。

    MCAD-开源

    R-207-2012技术报告是日本环境省国立环境研究所发布的一份重要文献,详细阐述了MCAD模型的理论基础、实现方法和应用案例。报告中包含了模型的详细说明、参数设定指南以及结果验证过程,为用户提供了全面的参考材料。...

    MCAD-MCSD Visual C# Certification all in one

    《MCAD-MCSD Visual C# Certification all in one》是一个针对微软认证的综合学习资源,旨在帮助考生准备MCAD(Microsoft Certified Application Developer)和MCSD(Microsoft Certified Solution Developer)的...

    ECAD与MCAD设计团队之间的沟通方案.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 CSharp Certification All in One Exam Guide

    一体化设计应对MCAD-ECAD协同设计挑战

    2. **深度集成**:集成的平台应该支持两种类型的CAD工具在同一环境中工作,无需额外的转换程序。 3. **版本管理**:有效管理不同设计版本,确保所有团队成员都在同一版本上工作,减少版本冲突。 4. **数据过滤和定制...

    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 Kit305&315

    优化协同式 ECAD - MCAD PCB 制造流程

    ### 优化协同式 ECAD - MCAD PCB 制造流程 #### 一、背景与挑战 随着技术的快速发展,特别是5G技术的应用以及物联网(IoT)设备的普及,电子产品正朝着更加定制化和个性化的方向发展。这些趋势对PCB(Printed Circuit...

    MCAD-MCSD Self-Paced Training Kit306&316

    MCAD-MCSD Self-Paced Training Kit306&316 MCAD-MCSD Self-Paced Training Kit306&316 MCAD-MCSD Self-Paced Training Kit306&316

    用Visual Basic .NET和Visual C#.NET开发XML Web服务与服务器组件

    XML Web服务是互联网上应用程序之间通信的一种方式,它利用了标准的XML(可扩展标记语言)格式进行数据交换。在本教程中,我们将深入探讨如何使用Microsoft的开发工具Visual Basic .NET和Visual C#.NET来创建和使用...

    web21编程:Web类的mcad编程

    在“Web21编程:Web类的MCAD编程”中,我们主要探讨的是现代Web开发技术,特别是针对JavaScript编程的应用。这个主题旨在帮助开发者掌握构建交互式、动态和响应式的Web应用程序所需的关键技能。让我们深入了解一下...

    pftw21:网络课程的Mcad Spring 21编程

    【标题】"pftw21:网络课程的Mcad Spring 21编程"涉及到的是一个网络课程项目,其中涵盖了Mcad(可能是Microcomputer Applications and Computer Design)春季21学期的编程教学内容。这个课程可能重点讲解了如何利用...

    XML WebService开发课件(含答案)

    这通常涉及生成客户端代理类,这些类是由服务的WSDL描述自动生成的,使得开发者可以像调用本地方法一样调用远程Web服务。课程中可能包括实际的代码示例,演示如何在不同编程环境中(如Visual Studio或Eclipse)实现...

    MCAD/MCSD Self-Paced Training Kit: Developing Web Applications with Microsoft Visual Basic .NET and Microsoft Visual C# .NET, Second Edition

    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, ...

Global site tag (gtag.js) - Google Analytics