Я хотел бы построить вспомогательный метод, который примет свойство как объект для анонимного метода. Это просто фиктивный пример кода, чтобы визуализировать проблему, а не противостоять реальному решению, которое является более сложным и не является предметом этого вопроса.Передача свойства как объекта методу
Некоторые код ссылки:
public class FooClass : SomeBaseClass {
public string StringProperty { get; set; }
public int IntProperty { get; set; }
public DateTime DateTimeProperty { get; set; }
public Object ComplexObjectProperty { get; set; }
public FooClass() {
this.FooMethod(this.StringProperty);
this.FooMethod(this.IntProperty);
this.FooMethod(this.DateTimeProperty);
this.FooMethod(this.ComplexObjectProperty);
}
public void FooMethod<T>(T obj) {
Func<bool> validateMethod =() => {
if(obj is string) return string.IsNullOrEmpty(obj.ToString());
return obj != null;
};
this.ValidateMethodsAggregate.Add(validateMethod);
}
}
public class SomeBaseClass {
protected IList<Func<bool>> ValidateMethodsAggregate = new List<Func<bool>>();
public void ValidateAll() {
foreach (var validateMethod in this.ValidateMethodsAggregate) {
var result = validateMethod();
// has errors and so on handling...
}
}
}
// Some simple code to show use case.
var foo = new FooClass();
foo.StringProperty = "new value";
foo.IntProperty = 123;
foo.ValidateAll(); // this will use "" , 0 instead of new values.
Итак, почему вы звоните ваш метод проверки в конструкторе? Совершенно очевидно, что в это время собственность еще не имеет значения. Почему бы вам не вызвать метод проверки в соответствующее время, когда для параметра «StringProperty» будет присвоено определенное значение? –
Вы получаете значение 'StringProperty' в конструкторе и никогда не устанавливаете его ни на что. Конечно, он будет использовать значение по умолчанию. Если вы хотите отложить чтение значения, вы можете либо изменить 'FooMethiod()', чтобы принять тип 'PropertyInfo', и использовать отражение в конструкторе для его получения, либо использовать делегат, например' FooMethod (() => StringProperty); ' – itsme86
Вы должны взглянуть на [FluentValidation] (https://github.com/JeremySkinner/FluentValidation). –