Я пишу библиотеку, похожую на Fluent Validator, которая позволит модифицировать объекты. Для обычных классов это работает без проблем, но я пытаюсь закодировать аналогичный подход с записью и натыкаюсь на большую проблему.
Правила определяются так же, как и в Fluent Validator:
RuleFor(x => x.Name).ForceUppercaseFormat();
Метод ForceUppercaseFormat() определен в классе расширения, который выглядит следующим образом:
public static ImmutableLogicRuleBuilder ForceUppercaseFormat(this ImmutableLogicRuleBuilder builder)
where TModel : INamed
{
builder.Apply(new StringToUpperCase(), (model, changedName) =>
{
model = model with { Name = changedName };
return model;
});
return builder;
}
Для справки
public interface INamed
{
string Name { get; }
}
Есть две проблемы. Во-первых, имя не имеет инициализации. Я не стал добавлять его вначале, потому что буду повторно использовать этот интерфейс для классов и записей. Я решил, что сосредоточусь на записях, поэтому добавил init. Это ничего не решило. По словам Райдера, TModel не является допустимой записью, поэтому я не могу использовать оператор with.
Есть ли способ ограничить использование универсального метода только для записей?
В качестве обходного пути я мог бы добавить две перегрузки для формата ForceUppercaseFormat() с Action и Func как мутаторы для класса и запись, но это выглядит некрасиво и много лишнего кода.
// for class
RuleFor(x => x.Name).ForceUppercaseFormat((x, newName) => x.Name = newName);
// for records
RuleFor(x => x.Name).ForceUppercaseFormat((x, newName) => x with {Name = newName});
Подробнее здесь: https://stackoverflow.com/questions/792 ... e-only-rec
Записи C#, есть ли способ добавить ограничения для общих, чтобы принудительно использовать только записи? ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Лучшая практика для (C#) общих библиотек, которые зависят от других общих библиотек
Anonymous » » в форуме C# - 0 Ответы
- 44 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Лучшая практика для (C#) общих библиотек, которые зависят от других общих библиотек
Anonymous » » в форуме C# - 0 Ответы
- 27 Просмотры
-
Последнее сообщение Anonymous
-