【问题标题】:What's would be the best way to apply custom formatting for my class property values?为我的类属性值应用自定义格式的最佳方法是什么?
【发布时间】:2019-04-11 11:47:05
【问题描述】:

我的情况是我正在使用一个遗留数据库,该数据库具有大多数代码共有的两个特征 - 有许多以固定长度保存的值用前导零填充,还有固定长度和尾随空格在末尾。处理起来很烦人,所以我试图弄清楚格式化这些值的最干净的方法是什么。

我现在主要关注的是格式化视图模型/dto。我只是通过查询或存储过程使用 Dapper 查询数据库,它们映射到我的 DTO 类,通过我的 webapi 作为 Json 提供。

现在这就是我的许多模型属性最终的样子:

    public string PurchaseOrderNumber
    {
        get => _purchaseOrderNumber.TrimStart('0');
        set => _purchaseOrderNumber = value;
    }

这只是到处重复。能够做这样的事情会很好:

[TrimZeros]
public string SupplierName { get; set; }

我也可以创建一个仅在 SQL 中执行此操作的函数,然后将其作为我所有 sql 查询/存储过程的责任。这在我使用像 Dapper 这样轻量级的东西时有效,但在我使用 Entity Framework 时则不然。

关于如何解决这个问题的任何建议?

【问题讨论】:

  • 为了获得 5% 的收益,您可以为 string 编写一个 TrimZeros() 扩展方法。打字会更容易。
  • 您还可以查看:code.google.com/archive/p/easyprop 和这个(它使用 setter,而不是 getter,但是...):stackoverflow.com/questions/4546935/…
  • 另外,在set 方法中调用TrimStart 可能会更有效一些(我假设采购订单号不会被多次设置,或者如果确实如此,它的设置频率低于读取频率)。
  • @Flydog57 - 正如您现在所说,我实际上已将此设置为扩展方法,只是为了清楚起见决定将其排除在外,因为这是我试图摆脱的。仍然是我找到的最佳选择!

标签: c# properties custom-attributes


【解决方案1】:

您可以使用隐式转换和辅助类:

public class LegacyString
{
     public string TrimmedValue {get; }

     public LegacyString(string value)
     {
         this.TrimmedValue = value?.TrimStart('0');
     }

     public static implicit operator string(LegacyString legacy)
         => legacy?.TrimmedValue; 

     public static implicit operator LegacyString(string legacyValue)
         => new LegacyString(legacyValue);

     public override string ToString() => this.TrimmedValue;
}

那么你在主课上要做的就是

public LegacyString PurchaseOrderNumber {get;set;}

你可以把它当作作业中的一个字符串来使用

myObj.PurchaseOrderNumber = "00001345";

在表达式中获取值

string poNumber = myObj.PurchaseOrderNumber;

您唯一会失去的是将poNumber 声明为var 并期望它是一个字符串的能力。但即便如此,如果您在预期字符串的地方使用 poNumber,则隐式转换会为您处理它。

【讨论】:

  • 这当然看起来很有趣,但乍一看我不确定它是否符合我的需要,我猜如果没有在模型构建器中进行特殊设置,这将不适用于 EF 模型绑定?还是 Dapper 或 AutoMapper 映射?还是序列化为 Json 字符串?我将不得不使用它,我肯定会在其他地方使用此设置。
猜你喜欢
  • 2023-01-24
  • 1970-01-01
  • 2015-12-11
  • 1970-01-01
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
相关资源
最近更新 更多