我有一个抽象的数据提供者,有很多方法。
在实现中,在继续使用方法的其余部分之前,每个方法都需要进行一些检查。此检查始终相同。
现在,在每种方法中,我都这样做:
public override string Method1 {
if(myCheck()) throw new Exception(...);
...Rest of my method1...
}
public override string Method2 {
if(myCheck()) throw new Exception(...);
...Rest of my method2...
}
public override string Method3 {
if(myCheck()) throw new Exception(...);
...Rest of my method3...
}
你明白了......
有更简单/更好/更短的方法吗?
答案 0 :(得分:2)
C#中没有内置功能。你可以在PostSharp中完成。
public sealed class RequiresCheckAttribute : OnMethodBoundaryAspect
{
public override void OnEntry(MethodExecutionEventArgs e)
{
// Do check here.
}
}
如果你想在普通的C#中做到这一点,那么可以让你的生活更轻松的一个小改进是将代码重构为一个单独的方法:
public void throwIfCheckFails() {
if(myCheck()) throw new Exception(...);
}
public override string Method1 {
throwIfCheckFails();
// ...Rest of my method1...
}
这不会强制每个方法来执行检查 - 它只是让它变得更容易。
答案 1 :(得分:1)
您可以通过以下方式填充基类:
public virtual string MethodCalledByMethod1 {
}
public virtual string MethodCalledByMethod2 {
}
public virtual string MethodCalledByMethod3 {
}
public string Method1 {
if(myCheck()) throw new Exception(...);
return MethodCalledByMethod1();
}
public string Method2 {
if(myCheck()) throw new Exception(...);
return MethodCalledByMethod2();
}
public string Method3 {
if(myCheck()) throw new Exception(...);
return MethodCalledByMethod3();
}
然后在你的孩子班上
public override string MethodCalledByMethod1 {
...Rest of my method1...
}
public override string MethodCalledByMethod2 {
...Rest of my method1...
}
public override string MethodCalledByMethod3 {
...Rest of my method1...
}
基本上,您覆盖由基类实现调用的方法1到3。基类实现包含mycheck(),所以你只需要担心写一次(即在基类实现中)。