2016-09-11 1 views
0

onSaveDataMethod 같은 것이 있습니까? 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

아니,하지 않는 한이 없다, 당신은 또한 확장 방법을 사용하여 볼 수 있었다 너는 하나 만들어. –

+0

그 효과를 얻을 수는 있지만 좀 더 복잡합니다 ... 대리인 및 이벤트를 사용하는 https://en.wikipedia.org/wiki/Interceptor_pattern – DarkSquirrel42

+0

이 가능합니다. –

답변

0

불행히도 대답은 당신이 당신의 자신의 validation 방법을 쓸 필요가없고입니다.

+0

나는 validate() 메소드를 가지고 있는데, save() 메소드를 호출하지 않고 save() 메소드 호출 이벤트에서이 메소드를 호출하려고한다. –

0

PostSharp와 함께 Intercepting Methods을 사용할 수 있습니다.

using PostSharp.Aspects; 
using PostSharp.Serialization; 

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

은 당신의 방법에 속성을 적용 : (more 참조) 측면을 만들기

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

당신은 당신이 모든 다른 사람이 상속되는 기본 클래스를 가지고 가정 같은 것을 할 수 있습니다. 기본 클래스 만 internalSave 함수를 알게되고 모든 상속 된 클래스는 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; 
} 

이 아직 수정할 수없는 존재하기 때문에 당신이 기본 클래스를 가질 수없는 경우 대신

public static class BaseClassNameExtensions 
{ 
    public static bool ValidatedSave(this BaseClassName obj) 
    { 
     obj.validate(); //again assuming it throws an exception 
     return obj.save(); 
    } 
} 
관련 문제