Итак, у меня есть простой шаблон правила проверки, который я использую для проверки на объектах сущности. Вот мой ValidationRule класс:У меня проблемы с дженериками и литье в C#
public class ValidationRule {
public Func<object, bool> Rule { get; set; }
public string ErrorMessage { get; set; }
public ValidationRule(string errorMessage, Func<object, bool> rule) {
Rule = rule;
ErrorMessage = errorMessage;
}
public bool IsValid(object obj) {
return Rule(obj);
}
}
У меня есть базовый класс для своих объектов сущностей, которые инкапсулируют методы для выполнения проверки, которая выглядит следующим образом:
public abstract class ModelBase {
private List<ValidationRule> _validationRules;
public List<ValidationRule> ValidationRules {
get {
if (_validationRules == null)
_validationRules = new List<ValidationRule>();
return _validationRules;
}
set { _validationRules = value; }
}
public ValidationResult Validate() {
var result = new ValidationResult();
rules.ForEach(r => {
if (!r.IsValid(this))
result.Errors.Add(
new ValidationError(r.ErrorMessage, r.PropertyName));
});
return result;
}
}
А теперь вот реальная проблема я пытаясь решить. Когда я создаю новый класс, который наследует от ModelBase, добавление правил проверки немного неудобно. Например:
public class Client : ModelBase {
public int ID{ get; set; }
public string Name { get; set; }
public Address MailingAddress { get; set; }
public Client() {
CreateValidationRules();
}
private void CreateValidationRules() {
ValidationRules.Add(new ValidationRule("Client 'Name' is required.",
c => !string.IsNullOrEmpty(((Client)c).Name)));
}
}
Обратите внимание, где я создаю список правил проверки. Внутри лямбда-выражения мне нужно отбросить «c» на «Клиент», потому что мое правило - это, по существу, Func<object, bool>
. Я пробовал много способов сделать это generic, делая что-то вроде ValidationRule<Client>
, но у меня всегда возникают проблемы с вызовом Validate()
в классе ModelBase. Любые идеи о том, как обойти это литье?
в качестве примечания, Func <объекта, BOOL> такой же, как Predicate
„То же“типа функциональности. Но по какой-то странной причине они не совпадают в системе типов. – MichaelGG
Они не то же самое, но вы можете конвертировать между ними. –