当前位置:   article > 正文

C#实现Json序列化-反射与特性_c# jsonconvert.serializeobject

c# jsonconvert.serializeobject

简介

这篇文章主要是围绕对象转换为json字符串来讲述反射和特性,但反射和特性不仅仅只是用来转换json字符串的啦,比如IOC容器或者抽象工厂都可以使用反射和特性,反射和特性对于编写一个灵活的程序是十分重要的,在很多常用的框架都可以看到它们的身影,比如我们常用的Newtonsoft.Json就有,所以我们这里主要来模仿其中的JsonConvert.SerializeObject(object obj)。
下面我们就进入主题吧。

反射是什么

首先来看看反射是一个什么东西。反射就是一种可以在运行过程中检查和处理程序元素的技术,对应在C#中的System.Type类和System.Reflaction.Assembly类。换句话说,其实就是通过反射技术,可以获取到关于类(比如类的属性、字段值、方法)或者程序集(程序集中有哪些类等)的信息,下面我们用一个最简单的类来说明一下。

public class Person
{
   
	public string name;
	public int age;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

上面定义了一个简单的类(Person),该类中只有2个字段值name和age。

那如果要将这个类转化为json的话,json看起来应该是下面这样子的(这里先随机赋值)。

{
    "name": "jack", "age": 10 }
  • 1
  • 2

那么问题来了,我们将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);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

当然,反射不仅仅只能获取类型的字段值,比如属性、方法、构造函数等等都是可以获取得到的,除此之外,还可以利用特性来构造对象,这里就不进一步讲述了。

特性是什么

自定义特性允许把自定义元数据与程序元素关联起来。比如我们经常看到的在类或者属性等等上面的[xxx],就是特性了。那么它有什么作用呢?
还是用上面的Person类转json字符串来解释一下。
假如我们要将json的name字段名改为fullname

{
    "fullname" : "jack", "age": 10 }
  • 1
  • 2

但我们程序里面不希望修改Person(因为很多时候一个类可能在很多地方使用,修改不方便,而且,很多时候json字符串中的字段名和类中的字段名不一致),那怎么办呢?这里就可以使用特性了。

[AttributeUsage(AttributeTargets.Field)]
  • 1
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号