Я пишу библиотеку, похожую на 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 ... d-so-i-can
Записи C#, есть ли способ сделать имя свойства частью записи, чтобы я мог использовать его с выражением? ⇐ C#
Место общения программистов C#
1733214679
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});
Подробнее здесь: [url]https://stackoverflow.com/questions/79245308/c-sharp-records-is-there-a-way-to-property-name-is-a-part-of-a-record-so-i-can[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия