`
net_liu
  • 浏览: 232603 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

反射动态调用类成员

F# 
阅读更多

使用反射动态调用类成员,需要Type类的一个方法:InvokeMember。对该方法的声明如下(摘抄于MSDN):

public object InvokeMember(

   string name,

   BindingFlags invokeAttr,

   Binder binder,

   object target,

   object[] args

);

参数

name

String,它包含要调用的构造函数、方法、属性或字段成员的名称。

- 或 -

空字符串 (""),表示调用默认成员。

invokeAttr

一个位屏蔽,由一个或多个指定搜索执行方式的 BindingFlags 组成。访问可以是 BindingFlags 之一,如 Public、NonPublic、Private、InvokeMethod 和 GetField 等。不需要指定查找类型。如果省略查找类型,则将应用 BindingFlags.Public | BindingFlags.Instance。

binder

一个 Binder 对象,该对象定义一组属性并启用绑定,而绑定可能涉及选择重载方法、强制参数类型和通过反射调用成员。

- 或 -

若为空引用(Visual Basic 中为 Nothing),则使用 DefaultBinder。

target

要在其上调用指定成员的 Object。

args

包含传递给要调用的成员的参数的数组。

 

返回值

表示被调用成员的返回值的 Object。

 

备注:

下列 BindingFlags 筛选标志可用于定义包含在搜索中的成员:

 

为了获取返回值,必须指定 BindingFlags.Instance 或 BindingFlags.Static。

指定 BindingFlags.Public 可在搜索中包含公共成员。

指定 BindingFlags.NonPublic 可在搜索中包含非公共成员(即私有成员和受保护的成员)。

指定 BindingFlags.FlattenHierarchy 可包含层次结构上的静态成员。

下列 BindingFlags 修饰符标志可用于更改搜索的执行方式:

 

BindingFlags.IgnoreCase,表示忽略 name 的大小写。

BindingFlags.DeclaredOnly,仅搜索 Type 上声明的成员,而不搜索被简单继承的成员。

可以使用下列 BindingFlags 调用标志表示要对成员采取的操作:

 

CreateInstance,表示调用构造函数。忽略 name。对其他调用标志无效。

InvokeMethod,表示调用方法,而不调用构造函数或类型初始值设定项。对 SetField 或 SetProperty 无效。

GetField,表示获取字段值。对 SetField 无效。

SetField,表示设置字段值。对 GetField 无效。

GetProperty,表示获取属性。对 SetProperty 无效。

SetProperty 表示设置属性。对 GetProperty 无效。

 

下面通过例题对该方法进行简单应用(我一直以为,要让例题起到更容易理解文字的意义和作用,撰写的例题越简单越直观越好。)

using System;

using System.Reflection;

 

namespace ConsoleApplication9

{

    class Love

    {

        public int field1;

        private string _name;

        public Love()

        {

        }

 

        public string Name

        {

            get

            {

                return _name;

            }

            set

            {

                _name=value;

            }

        }

 

        public int GetInt(int a)

        {

            return a;

        }

 

        public void Display(string str)

        {

            Console.WriteLine(str);

        }

    }

 

    /// <summary>

    /// Class1 的摘要说明。

    /// </summary>

    class Class1

    {

        /// <summary>

        /// 应用程序的主入口点。

        /// </summary>

        [STAThread]

        static void Main(string[] args)

        {

            //

            // TODO: 在此处添加代码以启动应用程序

            //

 

            Love love = new Love();

            Type type = love.GetType();

 

            Object obj = type.InvokeMember(null,

                BindingFlags.DeclaredOnly |

                BindingFlags.Public | BindingFlags.NonPublic |

                BindingFlags.Instance | BindingFlags.CreateInstance, null, null, args);

 

 

            //调用没有返回值的方法

            type.InvokeMember("Display",BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance , null , obj , new object[]{"aldfjdlf"});

 

            //调用有返回值的方法

            int i = (int)type.InvokeMember("GetInt",BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance,null,obj,new object[]{1});

            Console.WriteLine(i);

 

            //设置属性值

            type.InvokeMember("Name",BindingFlags.SetProperty,null,obj,new string[]{"abc"});

            //获取属性值

            string str=(string)type.InvokeMember("Name",BindingFlags.GetProperty,null,obj,null);

            Console.WriteLine(str);

 

            //设置字段值

            type.InvokeMember("field1",BindingFlags.SetField,null,obj,new object[]{444});

 

            //获取字段值

            int f=(int)type.InvokeMember("field1",BindingFlags.GetField,null,obj,null);

            Console.WriteLine(f);

            Console.ReadLine();

        }

    }

}

分享到:
评论

相关推荐

    (C#)利用反射动态调用类成员

    C#高级开发的工具,提高编程效率的利器,提升编程水平的必由之路

    反射,动态加载指定类调用类中的方法

    反射机制使得我们能够在运行时动态地获取类的信息,并且能够创建对象、调用方法、访问字段,甚至改变类的行为。在Java中,`java.lang.reflect`包提供了对反射的支持。 在“反射,动态加载指定类调用类中的方法”这...

    反射动态调用DLL方法,含参数

    在给定的场景中,“反射动态调用DLL方法,含参数”意味着我们要通过代码动态地调用DLL库中的特定方法,并且能够传递参数。下面将详细解释这一过程以及涉及的关键知识点。 1. 反射(Reflection): 反射是.NET框架...

    C#利用反射动态编译代码,创建类的实例,并调用其成员[文].pdf

    C#利用反射动态编译代码,创建类的实例,并调用其成员 在软件开发中,C#提供了强大的反射机制,允许开发者在运行时动态生成代码,创建类的实例,并调用其成员。本文将通过一个经典实例,介绍C#中的反射机制,并说明...

    c# 反射调用对象成员 !

    本教程将深入探讨如何使用C#的反射来调用对象成员,这对于编写灵活和高度自适应的代码至关重要。 首先,我们需要了解`System.Reflection`命名空间,它是C#反射的核心。在这个命名空间中,`Type`类代表了.NET框架中...

    C#私有成员反射调用类库

    私有成员反射调用在单元测试中有时是有用的,尤其是在测试内部逻辑或私有辅助方法时。例如,当我们想要验证某个私有方法的行为,但这个方法没有公开的入口点,反射就提供了一个解决方案。然而,这应该谨慎使用,因为...

    动态调用类模块.rar

    在编程领域,动态调用类模块是一个重要的概念,特别是在面向对象编程中。它允许程序在运行时决定要调用哪个类或方法,而不是在编译时就固定下来。这种技术通常与反射、元编程和插件系统相关联,极大地提高了代码的...

    通过反射调用静态方法

    本文将详细讲解如何通过反射调用静态方法,并探讨在特定场景下,如MyBatis中的应用。 首先,理解反射的概念是至关重要的。在Java中,反射API(java.lang.reflect)允许我们获取类的信息,包括类名、构造函数、方法...

    Java反射机制,通过对象访问调用类的私有成员或方法

    Java反射机制是Java编程语言中一个强大的特性,它允许程序在运行时动态地获取类的信息并操作类的对象。这一机制的核心在于,Java程序可以获取到关于任何类的内部信息,包括类名、属性、方法、构造器等,并能在运行时...

    JAVA反射机制动态调用 计算器对象的加法,减法函数;JAVA反射机制修改一个学生对象 的私有数据成员

    Java反射机制是Java语言提供的一种强大功能,它允许我们在运行时检查类、接口、字段和方法的信息,并且能够在运行时动态地创建对象和调用方法。这个机制在处理不确定类型或者需要灵活操作类的场景中非常有用。在这个...

    反射获取属性调用方法反射获取属性调用方法

    2. 反射调用方法: 反射同样可以用来动态调用类的方法。在Java中,`Method`类提供了这个功能: ```java Method method = clazz.getMethod("yourMethodName", argTypes); method.invoke(yourObject, argValues);...

    Java反射机制的动态调用计算器的加法,减法函数;修改一个学生对象的私有数据成员

    以下是反射调用`add`和`subtract`的代码示例: ```java Calculator calculator = new Calculator(); Class&lt;?&gt; calculatorClass = calculator.getClass(); Method addMethod = calculatorClass.getDeclaredMethod(...

    java动态调用方法

    Java动态调用方法是Java反射机制的一个重要应用,它允许我们在程序运行时,根据需要动态地获取类的信息并调用其方法。这种能力为代码的灵活性和可扩展性提供了强大的支持,尤其在处理不确定的对象类型或者需要在运行...

    Java反射调用方法

    在给定的代码中,`TestRef` 类展示了如何使用Java反射调用方法。首先,我们创建了一个 `Foo` 类,它有一个私有字符串成员变量 `msg` 和三个方法:`setMsg`、`getMsg` 和 `outInfo`。`main` 方法是演示反射调用的入口...

    JUnit4利用反射机制测试类的私有成员

    它允许我们动态地获取类的信息并对其进行操作,包括访问私有成员。要实现这一点,我们可以使用`java.lang.reflect`包中的`Class`、`Field`和`Method`类。 在给定的例子中,有一个`Commodity_Parent`类,它包含私有...

    java 反射 动态调用不同类的静态方法(推荐)

    动态调用不同类的静态方法是反射的一个常见应用,这在处理不确定类型或者需要在运行时决定调用哪个类的方法时非常有用。 以下是一个详细的解释: 1. **反射的基本概念:** - 类的加载:在Java程序中,当类首次被...

    C#,利用反射动态创建对象

    这些类提供了对元数据的访问,使我们能够在运行时了解和操作类的成员。 2. **获取类型信息** 要使用反射创建对象,首先需要获取目标类型的Type对象。这可以通过以下两种方式完成: - 使用`typeof`关键字:`Type ...

    反射修改私有成员变量例子

    * 动态调用类的方法 * 动态检查类的结构 反射机制修改私有成员变量的步骤 在本例中,我们将使用反射机制来修改私有成员变量的值。下面是步骤: 1. 获取类的 Class 对象 使用 `getClass()` 方法获取类的 Class ...

    C#动态调用Dll中的方法

    在.NET框架中,C#语言提供了强大的反射机制,允许程序在运行时检查自身,并能动态地创建对象和调用成员。本主题将深入探讨如何利用C#的反射特性来动态调用DLL(动态链接库)中的方法。首先,我们需要了解什么是DLL...

Global site tag (gtag.js) - Google Analytics