赞
踩
这篇文章主要是围绕对象转换为json字符串来讲述反射和特性,但反射和特性不仅仅只是用来转换json字符串的啦,比如IOC容器或者抽象工厂都可以使用反射和特性,反射和特性对于编写一个灵活的程序是十分重要的,在很多常用的框架都可以看到它们的身影,比如我们常用的Newtonsoft.Json就有,所以我们这里主要来模仿其中的JsonConvert.SerializeObject(object obj)。
下面我们就进入主题吧。
首先来看看反射是一个什么东西。反射就是一种可以在运行过程中检查和处理程序元素的技术,对应在C#中的System.Type类和System.Reflaction.Assembly类。换句话说,其实就是通过反射技术,可以获取到关于类(比如类的属性、字段值、方法)或者程序集(程序集中有哪些类等)的信息,下面我们用一个最简单的类来说明一下。
public class Person
{
public string name;
public int age;
}
上面定义了一个简单的类(Person),该类中只有2个字段值name和age。
那如果要将这个类转化为json的话,json看起来应该是下面这样子的(这里先随机赋值)。
{
"name": "jack", "age": 10 }
那么问题来了,我们将C#中的类转化成json字符串的时候,我们在程序里怎么知道Person这个类,它有name和age这2个字段或者说还有其他字段的呢?这个问题的答案就是利用反射技术。
public static void GetPersonFilesName()
{
GetObjFieldsName(typeof(Person));
}
public static void GetObjFieldsName(Type t)
{
// 通过Type.GetFields()方法获取该类型的所有字段值
foreach (var field in t.GetFields())
{
System.Console.WriteLine(field.Name);
}
}
当然,反射不仅仅只能获取类型的字段值,比如属性、方法、构造函数等等都是可以获取得到的,除此之外,还可以利用特性来构造对象,这里就不进一步讲述了。
自定义特性允许把自定义元数据与程序元素关联起来。比如我们经常看到的在类或者属性等等上面的[xxx],就是特性了。那么它有什么作用呢?
还是用上面的Person类转json字符串来解释一下。
假如我们要将json的name字段名改为fullname
{
"fullname" : "jack", "age": 10 }
但我们程序里面不希望修改Person(因为很多时候一个类可能在很多地方使用,修改不方便,而且,很多时候json字符串中的字段名和类中的字段名不一致),那怎么办呢?这里就可以使用特性了。
[AttributeUsage(AttributeTargets.Field)]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。