我有以下情况:
BankAccount
对象,DoubleAmount
属性为双精度。DoubleAmount
字段(即聚合等)。100.000
格式化为100k
。为实现这一点,我目前正在做的是以下课程:
public class BankAccount
{
public string Amount { get; set; } // This is serialized
// This property is used to do the calculation
[JsonIgnore]
public double DoubleAmount { get; set; }
public void FormatNumbers() {
// This method is called after I finish doing the calculations
// with my object and what it basically does is read DoubleAmount,
// format it and put the value on the Amount string.
}
}
事情是这堂课感觉不对。我不应该打电话给我FormatNumbers
...我每次更新Amount
时都能以某种方式更新我的DoubleAmount
,但仍然感觉很奇怪。
无论如何,你们有没有其他更好的方法来实现这个目标? 随意提出任何建议。谢谢!
答案 0 :(得分:4)
请勿使用 记住的方法来使用,因为这会违反ACID中的 C 一套规则。 C代表"一致性"。如果您有格式化方法,则可以:
account.DoubleAmount = 100000;
account.FormatNumbers();
Console.Write(account.Amount); // "100k" = ok
account.DoubleAmount = 0;
Console.Write(account.Amount); // "100k" = inconsistent = very bad
改为使用自定义getter:
public class BankAccount
{
[JsonIgnore]
public double DoubleAmount { get; set; }
public string FormattedAmount
{
get
{
return (this.DoubleAmount / 1000).ToString() + "k"; // example
}
}
}
如果您使用C#6.0,则此代码会变短:
public class BankAccount
{
[JsonIgnore]
public double DoubleAmount { get; set; }
public string FormattedAmount => $"{this.DoubleAmount / 1000}k";
}
但是,您应该只在动态时,在运行时,只在您需要显示原始,未格式化的值(双重)和格式化(到自定义字符串)时进行序列化(存储离线)。
答案 1 :(得分:1)
JsonConverter的示例用法。请注意,此处的示例转换器仅执行默认的双/字符串转换。您需要实现所需的实际转换。假设您正确实现了转换,此方法适用于序列化和反序列化。
public class BankAccount
{
[JsonConverter(typeof(DoubleJsonConverter))]
public double DoubleAmount { get; set; }
}
public class DoubleJsonConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType.IsSubclassOf(typeof(double));
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return double.Parse((string)reader.Value);
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteValue($"{value}");
}
}