大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> NET专区 -> (C#)利用反射动态调用类成员

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

时间: 2021-07-31 作者:daque

(C#)利用反射动态调用类成员 运用曲射动静挪用类分子,须要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(); } }}

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.