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 可以决定更改他们认为合适的命名约定。
我有一个序列化机制,可以在私有字段上工作,以确定什么应该序列化,什么不应该序列化。该方法背后的主要思想是仅序列化数据的 "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 可以决定更改他们认为合适的命名约定。