2016-06-27 6 views
0

私はコントロールを検証するために使用し、このクラスを持っている:プロパティとしてFunc <>を使用しますか?

public class Validation 
{ 
    public object Control { get; set; } 
    public string Message { get; set; } 
    public Func<Control, bool> Custom { get; set; } 

    public Validation() 
    { 
     //How to set Custom?? 
    } 

    private bool IsValid() 
    { 
     Control c = Control as Control; 
     if (c != null) 
     { 
      return (!string.IsNullOrWhiteSpace(c.Text)); 
     } 

     return true; 
    } 
} 

クラスは、単にコントロールのTextプロパティは、テキストが含まれていることを確認します。

このクラスを使用する特定のフォームで、特定のコントロールを検証するための独自のカスタムメソッドを設定できるように、クラスを拡張します。

質問:(?デフォルトIsValidまたは呼び出し元の形に配置カスタムメソッドのいずれか)私が方法であることがCustomプロパティを設定する方法を

+2

あなたの関数は、その 'Func'プロパティに一致するシグネチャが間違っています。最初の引数としてコントロール内を渡すことが期待されていますが、代わりにクラスから制御を受け取ります。 – poke

+0

'IsValid'を仮想化して、それぞれの派生クラスにメソッドをオーバーライドさせてみませんか?私はあなたがしようとしていることを誤解していますか? –

答えて

0

IsValidが持っていないので、あなたは、少し書き換える必要がありCustom関数の有効な署名です。

これはどうですか?

public Validation(Func<Control, bool> isValid = null) 
{ 
    //How to set Custom?? 
    Custom = isValid ?? this.IsValid; 
} 

private bool IsValid(Control c) 
{ 
} 

あなたは、コンストラクタでisValidのためのカスタム実装に渡すことができます。 nullの場合は、クラス内でIsValidメソッドを使用します。

+0

メソッドを呼び出す方法は? ( 'if(myValidation.Custom){}'? –

+0

'myValidation.Custom(c)'または 'myValidation.Custom.Invoke(c)'のように)。 –

0

私にはあなたの質問が少し混乱しているようです。私が理解しているように、あなたのIsValid()メソッドは、Custom関数があればそれを呼び出すことを望んでいます。

は、だから私はあなたがそのような何かをしたいFormを呼び出すことで推測:

Validation myCustomValidation = new Validation { Control = myTextBox }; 
Custom = ctl => ctl.Text == "validText"; 

そしてValidation.IsValid()の実装は次のようになります。あなたが提供することができます呼び出しFormでそう

private bool IsValid() 
{  
    Control c = Control as Control; 
    if (c == null) return true; 

    if (Custom != null) return Custom(c); 

    return (!string.IsNullOrWhiteSpace(c.Text)); 
}  

カスタム検証のためのラムダまたはメソッド。 IsValid()はこれを(これが設定されている場合)呼び出すか、デフォルト実装を使用するかを決めることができます。

関連する問題