如何动态访问类的属性

问题描述

如果动态创建了一个类.那么如何通过反射来遍历属性.比如用,Invoker方法,来调用属性.关键是要用属性的名字.能不能不用属性的名字来自动暴露属性呢.

解决方案

解决方案二:
usingSystem;namespaceWebtest{publicinterfaceinterface1{intadd();}publicclassReflectTest:interface1{publicStringWrite;privateStringWritec;publicStringWritea{get{returnWrite;}set{Write=value;}}privateStringWriteb{get{returnWritec;}set{Writec=value;}}publicReflectTest(){this.Write="Write";this.Writec="Writec";}publicReflectTest(stringstr1,stringstr2){this.Write=str1;this.Writec=str2;}publicstringWriteString(strings,intb){return"欢迎您,"+s+"---"+b;;}publicstaticstringWriteName(strings){return"欢迎您光临,"+s;}publicstringWriteNoPara(){return"您使用的是无参数方法";}privatestringWritePrivate(){return"私有类型的方法";}publicintadd(){return5;}}}然后,建立再建立一个项目引入该HelloWorld.dll,usingSystem;usingSystem.Threading;usingSystem.Reflection;classTest{delegatestringTestDelegate(stringvalue,intvalue1);staticvoidMain(){//Assemblyt=Assembly.LoadFrom("HelloWorld.dll");与下面相同的效果Assemblyt=Assembly.Load("HelloWorld");foreach(Typeaaaint.GetTypes()){//Console.Write(aaa.Name);//显示该dll下所有的类}Module[]modules=t.GetModules();foreach(Modulemoduleinmodules){//Console.WriteLine("modulename:"+module.Name);//显示模块的名字本例为"HelloWorld.dll"}Typea=typeof(Webtest.ReflectTest);//得到具体的类的类型,和下面一个效果//Typea=t.GetType("Webtest.ReflectTest");////Console.Write(a.Name);string[]bb={"aaaa","bbbbb"};objectobj=Activator.CreateInstance(a,bb);//创建该类的实例,后面的bb为有参构造函数的参数//objectobj=t.CreateInstance("Webtest.ReflectTest");//与上面方法相同MethodInfo[]miArr=a.GetMethods();foreach(MethodInfomi0inmiArr){//Console.Write(mi0.Name);//显示所有的共有方法}MethodInfomi=a.GetMethod("WriteString");//显示具体的方法object[]aa={"使用的是带有参数的非静态方法",2};strings=(string)mi.Invoke(obj,aa);//带参数方法的调用MethodInfomi1=a.GetMethod("WriteName");String[]aa1={"使用的是静态方法"};strings1=(string)mi1.Invoke(null,aa1);//静态方法的调用MethodInfomi2=a.GetMethod("WriteNoPara");strings2=(string)mi2.Invoke(obj,null);//不带参数的方法调用MethodInfomi3=a.GetMethod("WritePrivate",BindingFlags.Instance|BindingFlags.NonPublic);strings3=(string)mi3.Invoke(obj,null);//私有类型方法调用//Console.Write(s3);PropertyInfo[]piArr=a.GetProperties(BindingFlags.Instance|BindingFlags.NonPublic|BindingFlags.Public);foreach(PropertyInfopiinpiArr){//Console.Write(pi.Name);//显示所有的方法}PropertyInfopi1=a.GetProperty("Writea");//pi1.SetValue(obj,"Writea",null);//Console.Write(pi1.GetValue(obj,null));PropertyInfopi2=a.GetProperty("Writeb",BindingFlags.Instance|BindingFlags.NonPublic|BindingFlags.Public);pi2.SetValue(obj,"Writeb",null);//Console.Write(pi2.GetValue(obj,null));FieldInfofi1=a.GetField("Write");//Console.Write(fi1.GetValue(obj));ConstructorInfo[]ci1=a.GetConstructors();foreach(ConstructorInfociinci1){//Console.Write(ci.ToString());//获得构造函数的形式}ConstructorInfoasCI=a.GetConstructor(newType[]{typeof(string),typeof(string)});//Console.Write(asCI.ToString());Webtest.interface1obj1=(Webtest.interface1)t.CreateInstance("Webtest.ReflectTest");Webtest.ReflectTestobj2=(Webtest.ReflectTest)t.CreateInstance("Webtest.ReflectTest");//Console.Write(obj1.add());典型的工厂模式foreach(Typettint.GetTypes()){if(tt.GetInterface("interface1")!=null){Webtest.interface1obj3=(Webtest.interface1)Activator.CreateInstance(a);//Console.Write(obj3.add());}}TestDelegatemethod=(TestDelegate)Delegate.CreateDelegate(typeof(TestDelegate),obj,"WriteString");//动态创建委托的简单例子Console.Write(method("str1",2));Console.Read();}}

供你参考

时间: 2024-10-25 22:05:23

如何动态访问类的属性的相关文章

Python实现动态添加类的属性或成员函数的解决方法_python

某些时候我们需要让类动态的添加属性或方法,比如我们在做插件时就可以采用这种方法.用一个配置文件指定需要加载的模块,可以根据业务扩展任意加入需要的模块. 本文就此简述了Python实现动态添加类的属性或成员函数的解决方法,具体方法如下: 首先我们可以参考ulipad的实现:mixin. 这里做的比较简单,只是声明一个类,类初始化的时候读取配置文件,根据配置列表加载特定目录下的模块下的函数,函数和模块同名,将此函数动态加载为类的成员函数. 代码如下所示: class WinBAS(Bas): def

修改自定义类中属性的可见性问题(动态增减类的属性个数)

问题描述 之前发了一个帖子问题描述的太简单了给大家造成了误解这里重新开贴详细说明出于项目要求需要定义一个属性可以动态增加的类(比如说定义一个截面类,包含形状.半径.长度.宽度四个属性,其中形状枚举圆形和矩形两种,选择圆形时显示半径属性不显示长宽属性,选择矩形时显示长宽属性不显示半径属性.也就是说利用PropertyGrid控件展示该类的属性是,当选择圆形时PropertyGrid可以显示2个属性,选择矩形时PropertyGrid则显示3个属性,无论2个属性还是3个属性对应的是同一个实例)于是在

(论坛答疑点滴)如何动态设定类的属性和字段?

动态 正好有人问这个,代码非常简单,最基本的应用,直接贴代码 using System; namespace Test {     /**//// <summary>     /// Class1 的摘要说明.     /// </summary>     class Class1     {         /**//// <summary>         /// 应用程序的主入口点.         /// </summary>         [ST

ruby学习笔记(4)-动态修改类的属性

动态语言之所以"动态",最明显的特征就是:类实例的行为/属性可以在new出后,动态修改!个人觉得这种处理相对java/c#(静态语言)来说,更符合现实世界. 比如:一个人刚出生时,除了哭.吃奶等这些基本原始本能,其它的几乎全都不会(原始本能可理解类定义中最开始定义的属性和方法),但随着时间推移,学会了看书,走路,说话...(相当于新增了方法/属性),再往后的人生谁也无法预料,一切都是未知的,所以不太可能象静态语言那样,在运行前就事先把所有的属性/方法全写齐,甚至一个人后来失忆,把原先学

在Java中动态执行类的静态方法

在Java中,通过Class.forName()方法可以动态决定加载哪一个类,这个功能对于相同接口的不同实现来讲非常有用.比如对于设计好的数据库连接池接口,我们可以有多种的接口实现类来完成相同的功能,同时用户可以简单的通过修改配置文件来指定实际使用哪一个实现类,在源代码里面通过读取配置文件信息,并用Class.forName(configClassName).getInstance()就可以构造一个特定的实现类实例,而不用每次修改源代码.这样对于程序来讲只用关心接口的定义,用户只用进行配置文件的

Python的类实例属性访问规则探讨_python

一般来说,在Python中,类实例属性的访问规则算是比较直观的. 但是,仍然存在一些不是很直观的地方,特别是对C++和Java程序员来说,更是如此. 在这里,我们需要明白以下几个地方: 1.Python是一门动态语言,任何实体都可以动态地添加或删除属性. 2.一个类定义了一个作用域. 3.类实例也引入了一个作用域,这与相应类定义的作用域不同. 4.在类实例中查找属性的时候,首先在实例自己的作用域中查找,如果没有找到,则再在类定义的作用域中查找. 5.在对类实例属性进行赋值的时候,实际上会在类实例

C#箴言之用属性来访问类的私有成员

访问|来访 在程序中,难免要访问某个对象的私有成员.那么以前实现这类功能的方法有两种,第一种方法最简单,就是把成员访问符从"private"改为"public"即可:而另一个就是提供公有的成员访问函数来进行访问.那么现在用C#编写程序,就不再需要采用前面所说的两种方法了,而直接使用属性来完成. 首先来看看三种方法的如何实现以及调用的,这里用一个例子来说明,即访问"EmployeeInfo"类的私有成员strName,具体如下表格所示.   pri

Emit学习-基础篇-为动态类添加属性、构造函数、方法

我们通过一个计算A+B的动态类来演示如何为一个动态类添加属性.构造函数 .方法,以及在方法中使用类中定义的属性,按照惯例,我们先给出要实现的动 态类的C#代码,然后再针对C#代码给出相应的实现,代码如下: Add public class Add { private int _a = 0; public int A { get { return _a; } set { _a = value; } } private int _b = 0; public int B { get { return

javascript-求前端大神解释js动态访问对象属性的问题

问题描述 求前端大神解释js动态访问对象属性的问题 在js我有一个这样的需求:对象temp里面有name1name2,name3 属性这样访问属性:temp.(""name""+1)temp.(""name""+2)temp.(""name""+3)为什么不行?但是在groovy里是可以的 解决方案 这个市解释器不一样吧你要是使用 temp['name'+1]肯定是好使的.所以编写的js