C# 利用反射动态调用类成员
用反射动态调用类成员,需要Type类的一个方法:InvokeMember。对该方法的声明如下(摘抄于MSDN):
publicobject 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 ConsoleApplication
{
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);
}
}
class Class1
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
staticvoidMain(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# 知识点笔记:IEnumerable<>的使用,利用反射动态调用方法
IEnumerable<T>的使用 创建一个IEnumerable对象 List<string> fruits = new List<string> { " ...
- C#利用反射动态调用DLL并返回结果,和获取程序集的信息
反射的基本概念: .Net Framework 中提供了反射机制,可以再加载程序运行时,动态获取和加载程序集,并且可以获取到程序集的信息 创建Assembly和Entity两个程序集,在Assembl ...
- 利用java反射动态调用方法,生成grid数据
项目中需要java后台查询并组装前台grid的数据,数据行数不定,数据行定义不定,开始用了最原始的方法,写了几百行,就是前台需要什么字段后台拼接什么字段,java代码冗余量非常大,并且不够灵活,一旦前 ...
- C# 利用反射动态加载dll
笔者遇到的一个问题,dll文件在客户端可以加载成功,在web端引用程序报错.解决方法:利用反射动态加载dll 头部引用加: using System.Reflection; 主要代码: Assembl ...
- C# 利用反射动态创建对象[摘录]
摘自:http://hi.baidu.com/yangyuhang/blog/item/f12ea90e13f214e336d12250.html 在VS.Net中,有很多种方法动态调用对象的构造函数 ...
- C# 利用反射动态创建对象——带参数的构造函数和String类型
C# 利用反射动态创建对象——带参数的构造函数和String类型 最近笔者有一个想法需要利用反射动态创建对象(如string,int,float,bool,以及自定义类等)来实现,一直感觉反射用不好, ...
- 使用反射动态调用ActiveX控件
使用反射动态调用ActiveX控件 袁永福 2018-3-2 ■■■■问题描述: 目前的基于.NET平台的软件研发中仍然存在大量的对COM及ActiveX控件的调用.使用C#调用ActiveX控件时一 ...
- 利用反射创建User类的对象
package com.bjpowernode; public class User { private int age; public String name; public void m1() { ...
- OC 反射-->动态创建类
系统方法 NSLog(@"%s", __func__); //打印出类的方法名称,如: //打印结果:2018-02-22 10:52:15.394575+0800 DemoRun ...
随机推荐
- actionInvocation
1.actionInvocation是什么 ActionInvocation就是Action的调用者.ActionInvocation在Action的执行过程中,负责Interceptor.Actio ...
- lua select
可以用这样的方法产生类似foreach的功能: function printargs(...) local num_args = select("#", ...) for i = ...
- CSS布局方案之圣杯布局
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- dojo.byId、dojo.query、dojo.attr
概述: dojo.byId(/*string*/id或/*DomNode*/node) 1.传入DOMNode返回传入的domNode; 2.传入id返回id为当前值的domNode dojo.que ...
- 计算两个集合的交集数字(java)
循环判断2个数组 将相同的公共元素复制到新数组中即可 import java.util.Arrays; public class count_same_number { public static i ...
- 获取Location
1.连接一个二进制的库用来定位 CoreLocation Build Phases中加号添加 2.对于ios8.0以上的需要配置 NSLocationWhenInUseUsageDescription ...
- 转:C#: static关键字的作用
tatic意思是静态,可以修饰类.字段.属性.方法 标记为static的就不用创建实例对象调用了,可以通过类名直接点出来 static三种用法: 1.用于变量前,表示每次重新使用该变量所在方法.类或自 ...
- eclipse使用Git插件
折腾了会Git,记录一下下. 1.安装Git Help-->Install New Software 点击Add,Name随意,Location为http://download.eclips ...
- MySql5压缩包安装
一. 解压所有文件到一个目录:例如D:\Program Files\mysql-5.6.22-winx64 二. 配置系统的环境变量:在Path路径后追加:;D:\Program Files\mysq ...
- 复习篇(一)Activity的生命周期和启动模式
(一)关于<intent-filter>中的<data> 当设置<data>过滤器的时候,使用intent的时候必须要设置响应的匹配,否则无法匹配成功.不过不设置则 ...