Как лучше всего применить пользовательское форматирование для значений моего класса? - PullRequest
0 голосов
/ 08 ноября 2018

Моя ситуация в том, что я работаю с устаревшей базой данных, которая имеет две черты, которые являются общими для большей части кода - есть много значений, сохраненных с фиксированной длиной, дополненных лидирующими нулями, а также фиксированной длины с конечным пробелом в конце. Очень неприятно иметь дело, поэтому я пытаюсь выяснить, какой будет самый чистый подход к форматированию этих значений.

Мое основное внимание сейчас уделяется форматированию представлений моделей / dtos. Я просто опрашиваю базу данных с помощью Dapper с помощью запросов или хранимых процедур, которые отображаются в мой класс DTO, который через J-порт получает Json.

Прямо сейчас вот как выглядят многие свойства моей модели:

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

Это просто повторяется повсюду. Было бы неплохо иметь возможность сделать что-то вроде этого:

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

Я мог бы также создать функцию, которая просто делает это в SQL, а затем взять на себя ответственность за все мои sql запросы / хранимые процедуры. Это работает, когда я использую что-то легкое, как Dapper, но не так сильно, когда я использую Entity Framework.

Любые рекомендации о том, как подойти к этому?

1 Ответ

0 голосов
/ 08 ноября 2018

Вы можете использовать неявное приведение и вспомогательный класс:

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 там, где ожидалась строка, преобразование имплика позаботится об этом за вас.

...