C#6.0反射:提取只读自动属性的支持字段的名称

时间:2015-10-16 13:02:21

标签: c# serialization reflection c#-6.0

我有一个序列化机制,可以在私有字段上工作,以确定应该序列化的内容和不应该序列化的内容。该方法背后的主要思想是仅序列化数据的“本质”。

示例:

public class Person {
    private readonly string _firstName;
    private readonly string _lastName;

    public C1(string firstName, string lastName) {
        _firstName = firstName;
        _lastName = lastName;
    }

    public string FirstName { get { return _firstName; } }
    public string LastName { get { return _lastName; } }
    public string FullName { get { return _firstName + " " + _lastName; } }
}

序列化的示例对象将如下所示(JSON):

{ "firstName": "John", "lastName": "Doe" }

如您所见,基于字段的序列化可确保FullName未序列化。

这种机制已经存在了一段时间并且完美无缺。但是,使用C#6.0中新的只读自动属性,这些字段的名称很尴尬,例如: <FirstName>k__BackingField

当然,我可以更新我的序列化代码以从支持字段中提取实际属性名称,并在序列化期间使用该名称。我想知道的是:这是一个强大的解决方案吗?或者生成的支持字段的命名是否会发生变化?

注意:这种方法的原因是模型类可以保持与序列化无关。我知道我也可以使用[JsonIgnore]属性来实现相同的功能,但我不想将这些属性添加到我的模型类中。

2 个答案:

答案 0 :(得分:3)

听起来,您通过命名约定将支持字段与属性的关联基础化。如果你有一个私人字段_name和一个属性Name,那么字段必须成为该属性的支持字段。

  

这是一个强有力的解决方案吗?

不 - 一个强大的解决方案是为每种类型实现序列化,因为只有它知道哪些字段与哪个属性相关联。

  

或者生成的支持字段的命名是否会发生变化?

这是一个实现细节 - MS可以决定改变他们认为合适的命名约定。

答案 1 :(得分:0)

另一种方法,可能是使用ContractResolver,而不是与反映汽车属性相关的无聊事物进行斗争。

我将省略任何示例,因为我提供的链接有3个实用示例,可​​以引导您完成必需品。