2016-09-11 3 views
0

onSaveDataMethod.Callのようなものはありますか?C#でトリガのようなものがありますか?C#で別のメソッド呼び出しイベントでメソッドをトリガできますか?

コード内で直接メソッドを呼びたくないです。例えば

bool save() 
{ 
validate() // id do not want to call this validate() method 
      // it should be called automatically before saving method 

saveRecord(); 
return true; 

} 
+1

拡張メソッドを使用して見て可能性がありません、しない限りがありませんあなたは1つを作る。 –

+0

あなたはその効果を得ることができます...しかし、それは少し複雑です... https://en.wikipedia.org/wiki/Interceptor_pattern – DarkSquirrel42

+0

代理人とイベントを使用することは可能です。 –

答えて

0

は、残念ながら答えは、あなたがあなた自身のvalidation方法を記述する必要は、ないです。

+0

私はvalidate()メソッドを持っていますが、save()メソッドではなくsave()メソッド呼び出しイベントでこのメソッドを呼び出すようになりました。 –

0

PostSharpでIntercepting Methodsを使用できます。 (moreを参照)側面を作成します。

using PostSharp.Aspects; 
using PostSharp.Serialization; 

[PSerializable] 
public class ValidationAspect : OnMethodBoundaryAspect 
{ 
    public override void OnEntry(MethodExecutionArgs args) 
    { 
     // make you validation here 
     validate(); 
    } 
} 

あなたのメソッドに属性を適用します。

[ValidationAspect] 
bool save() 
{ 
    saveRecord(); 
    return true; 
} 
0

あなたは他のすべてが継承されている基本クラスを持っていると仮定すると、このような何かを行うことができます。基本クラスのみがinternalSave関数を知り、すべての継承クラスはsaveを呼び出し、自動的に検証されます。

save関数のメンバアクセス修飾子(protected)を必要に応じて変更しますが、internalSaveをプライベートにして、その関数を呼び出さずに検証をバイパスします。

protected bool save(){ 
    validate(); //Assuming this throws an exception to inform it is not valid 
    return internalSave(); 
} 
private bool internalSave(){ 
    saveRecord(); 
    return true; 
} 

1はすでにあなたが変更できないことが存在するので、あなたは、基本クラスを持つことができない場合は、代わり

public static class BaseClassNameExtensions 
{ 
    public static bool ValidatedSave(this BaseClassName obj) 
    { 
     obj.validate(); //again assuming it throws an exception 
     return obj.save(); 
    } 
} 
関連する問題