2017-02-04 9 views
0

Я хотел бы построить вспомогательный метод, который примет свойство как объект для анонимного метода. Это просто фиктивный пример кода, чтобы визуализировать проблему, а не противостоять реальному решению, которое является более сложным и не является предметом этого вопроса.Передача свойства как объекта методу

Некоторые код ссылки:

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. 
+0

Итак, почему вы звоните ваш метод проверки в конструкторе? Совершенно очевидно, что в это время собственность еще не имеет значения. Почему бы вам не вызвать метод проверки в соответствующее время, когда для параметра «StringProperty» будет присвоено определенное значение? –

+0

Вы получаете значение 'StringProperty' в конструкторе и никогда не устанавливаете его ни на что. Конечно, он будет использовать значение по умолчанию. Если вы хотите отложить чтение значения, вы можете либо изменить 'FooMethiod()', чтобы принять тип 'PropertyInfo', и использовать отражение в конструкторе для его получения, либо использовать делегат, например' FooMethod (() => StringProperty); ' – itsme86

+0

Вы должны взглянуть на [FluentValidation] (https://github.com/JeremySkinner/FluentValidation). –

ответ

0

Используйте функцию и условный оператор с частным методом бэк

 public FooClass() 
     { 
      this.FooMethod(() => StringProperty); // <- pass an accessor 
     } 
     public Func<bool> validateMethod; 
     private void FooMethod<T>(Func<T> obj) 
     { 
      //validate method 
      validateMethod =() => string.IsNullOrEmpty(obj()?.ToString()); 
     } 

Использование будет

 var y = new FooClass(); 
     var resTrue = y.validateMethod(); 
     y.StringProperty = "Hi"; 
     var resFalse = y.validateMethod(); 
+0

Благодарим вас за четкий ответ. – Patryk