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

C# 6.0 Reflection: Extract the name of backing fields of read-only auto properties

我有一个序列化机制,可以在私有字段上工作,以确定什么应该序列化,什么不应该序列化。该方法背后的主要思想是仅序列化数据的 "essence"。

示例:

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] 属性来实现相同的目的,但我不想将此类属性添加到我的模型中 类.

另一种方法可能是使用 ContractResolver,而不是纠结于反映自动属性的机智相关的空洞。

我将省略任何示例,因为我提供的 link 有 3 个实际示例,可以引导您完成必要的操作。

听起来您是根据命名约定将支持字段的相关性建立在 属性 的基础上。如果你有一个私有字段 _name 和一个 属性 Name,那么字段 必须 是那个 属性 的支持字段。

Is this a robust solution?

否 - 一个可靠的解决方案是为每种类型实现序列化,因为 只有它 确定哪些字段与哪些字段相关联 属性。

Or is the naming of the generated backing fields subject to change?

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