Записи C#, есть ли способ добавить ограничения для общих, чтобы принудительно использовать только записи?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Записи C#, есть ли способ добавить ограничения для общих, чтобы принудительно использовать только записи?

Сообщение Anonymous »

Я пишу библиотеку, похожую на 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 ... -only-reco
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»