2017-02-04 3 views
0

Ich möchte eine Hilfsmethode erstellen, die die Eigenschaft als Objekt zur anonymen Methode nimmt. Dies ist nur ein Dummy-Code-Beispiel, um das Problem zu visualisieren und nicht mit einer realen Lösung zu konfrontieren, die viel komplexer ist und nicht Gegenstand dieser Frage ist.Übergabe der Eigenschaft als Objekt an die Methode

Einige Referenz-Code:

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

sein Also warum dann rufen Sie Ihre Validierungsmethode im Konstruktor? Es ist ziemlich offensichtlich, dass die Immobilie zu diesem Zeitpunkt noch keinen Wert hat. Warum rufen Sie die Validierungsmethode nicht zur richtigen Zeit auf, wenn "StringProperty" ein Wert zugewiesen wird? –

+0

Sie erhalten den Wert von 'StringProperty' im Konstruktor und setzen ihn niemals auf irgendetwas. Natürlich wird der Standardwert verwendet. Wenn Sie das Lesen des Wertes verzögern möchten, können Sie 'FooMethiod()' ändern, um einen 'PropertyInfo'-Typ zu akzeptieren und Reflektion im Konstruktor verwenden, um das zu erhalten, oder verwenden Sie einen Delegaten wie' FooMethod (() => StringProperty); ' – itsme86

+0

Sie sollten sich [FluentValidation] (https://github.com/JeremySkinner/FluentValidation) ansehen. –

Antwort

0

eine Funktion verwenden und einen bedingten Operator mit einem privaten Träger Methode

 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()); 
     } 

Die Nutzung würde

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

Vielen Dank für die klare Antwort. – Patryk

Verwandte Themen