c#如何利用反射动态获取对象属性的值

c#如何利用反射动态获取对象属性的值,第1张

先写一个从字符串生成任何类型的对象的函数 public object stringToObject(string str,Type objectType)//传递两个参数,一个是字符串含有每个属性的属性名和值对,属性和值用冒号分隔,属性与属性用逗号分隔,另一个参数是要创建的对象的类型 { string[] shuxing = strSplit(new char[] { ',' });//将字符串分解成 “属性:值”数组 for (int i = 0; i < shuxingLength; i++) { shuxing[i]= shuxing[i]Replace("\"", ""); }//去掉字符串的双引号 object obj = SystemActivatorCreateInstance(objectType); //使用反射动态创建对象 PropertyInfo[] pis =obj GetType()GetProperties(BindingFlagsPublic|BindingFlagsInstance);//获得对象的所有public属性 if (pis != null)//如果获得了属性 foreach (PropertyInfo pi in pis)//针对每一个属性进行循环 { for (int i = 0; i <shuxingLength; i++)//检查字符串中的所有“属性:值”列表 { if (shuxing[i]Split(new char[] { ':' })[0] == piName)//如果对象的属性名称恰好和字符串中的属性名相同 { Type proertyType= piPropertyType; //获得对象属性的类型 piSetValue(obj, ConvertChangeType(shuxing[i]Split(new char[] { ':' })[1],proertyType), null); //将字符串中的字符串类型的“值”转换为对象属性的类型,并赋值给对象属性 } } } return obj; }

反射:在运行状态下,通过class文件对象,去使用构造方法,成员变量,成员方法

方法有三种:

1类名class

2对象getclass()

3classforName("包名类名")

好处:

只要有一个类或者一个类的对象,就可以得到这个类或对象的所有属性和方法,包括私有的

同步方法

反射成员方法:

1获取字节码文件

Class c = ClassforName("包名类名");

2反射方法

Method m = cgetMethod("反射的方法",方法的参数类型class);

3用方法,minvoke(对象,参数) 对象,cnewInstance ,在A建立对象。

minvoke(cnewInstance(),参数);

类加载器与反射有什么关系

反射是通过字节码文件对象,将类的字段,方法,构造器等映射成相应的类,并进行各自的 *** 作;

类加载器是通过某个类的classLoader()方法,将该类的class文件从硬盘中加载到java虚拟机中,形成字节码文件;

每一个class都有一个Class对象。一个java文件经过编译,再生成的class文件中,就会创建一个Class对象。只有一个。他表示整个类的类型信息。

那么通常我们创建对象的方式又有几种呢?

五种:

1通过new 语句创建对象。

2通过静态工厂方法创建,比如AgetNewInstance();

3通过反射技术来实现。可以调用Class类或Constructor类的newInstance()方法。

4通过调用对象的clone()方法

5利用I/O流技术的反序列化来实现。

回归正题获取Class对象(实例)有三种方法:

1通过class的方式创建Class实例:类名class

2通过对象的getClass()方法获得。

3通过Class类的forName()方法来获得。

反射:可以说是一中技术手段,利用反射可以访问,检测,修改本身行为状态的一种方式。利用反射我们可以创建实例。

其实质就是:反编译:class---反编译成java文件。

所以说他是一个强大的工具,他可以创建更加灵活的代码,在运行期装配。使我们可以在运行期,动态的访问对象有哪些方法,动态,并可以为修改对象的属性,在运行期动态的访问任何对象的任何方法。

而且他降低了代码的耦合度,提高了可扩展性。

但是反射使用不当会成本很高。而且反射本身比直接硬编码更加复杂,所以一般性小程序尽量不要用,他适合一些对灵活度和可扩展性比较强的框架中。

而且他会模糊程序结构,不利于理解程序流程。可维护性不好。

首先要获取对象的类型,根据类型再获取Attribute,同一类型的对象获取到的Attribute是相同的。

        static void Main(string[] args)

        {

            Type ty=typeof(SystemWindowsFormsButton);

            foreach (Attribute attribute in tyGetCustomAttributes(true))

            { 

                ConsoleWriteLine(attribute);

            }

            ConsoleRead();

        }

上述代码的结果如下:

SystemRuntimeInteropServicesComVisibleAttribute

SystemRuntimeInteropServicesClassInterfaceAttribute

SystemWindowsFormsSRDescriptionAttribute

SystemComponentModelDesignerAttribute

SystemComponentModelDesignerAttribute

SystemWindowsForms,Allow

SystemComponentModelDefaultPropertyAttribute

SystemComponentModelDefaultEventAttribute

SystemComponentModelDesignerAttribute

SystemComponentModelDesignSerializationDesignerSerializerAttribute

SystemComponentModelDesignerCategoryAttribute

那就需要利用扩展方法,现将T的Type获取到,方法如下:

public static class Extensions

{

public static Type GetListItemType<T>(this IList<T> list)

{

return typeof(T);

}

}

本文主要阐述Objective-C如何通过runtime反射获取方法并调用

属性和变量的反射遍历可以参考 >

以上就是关于c#如何利用反射动态获取对象属性的值全部的内容,包括:c#如何利用反射动态获取对象属性的值、反射是什么反射获取字节码文件的三种方式、获得Class类对象的几种方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/10056961.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-04
下一篇2023-05-04

发表评论

登录后才能评论

评论列表(0条)

    保存