我所拥有的所有东西我已经尝试了一段时间,但还没有找到一个好的策略来做到这一点,我不确定C#能否支持我正在尝试做的事情。
示例假设有一个类似的模板,在管理器代码中重复,以覆盖概念函数的形式重复,返回由成功标志和错误列表组成的结果。
public Result<Boolean> RemoveLocation(LocationKey key) { List<Error> errorList = new List<Error>(); Boolean result = null; try{ result = locationDAO.RemoveLocation(key); }catch(UpdateException ue){ //Error happened less pass this back to the user! errorList = ue.ErrorList; } return new Result<Boolean>(result, errorList); }
希望将其转换成如下所示的模板,其中“ Do Something”是一些返回布尔值的调用(最好不是静态的)。我知道我可以在堆栈的意义上做到这一点,但我确实在寻找一种通过对象引用来做到这一点的方法。
public Result<Boolean> RemoveLocation(LocationKey key) { var magic = locationDAO.RemoveLocation(key); return ProtectedDAOCall(magic); } public Result<Boolean> CreateLocation(LocationKey key) { var magic = locationDAO.CreateLocation(key); return ProtectedDAOCall(magic); } public Result<Boolean> ProtectedDAOCall(Func<..., bool> doSomething) { List<Error> errorList = new List<Error>(); Boolean result = null; try{ result = doSomething(); }catch(UpdateException ue){ //Error happened less pass this back to the user! errorList = ue.ErrorList; } return new Result<Boolean>(result, errorList); }
如果您需要更多信息,请告诉我。
我很想看看别人能提出什么。
Marc解决方案应用于以上代码
public Result<Boolean> CreateLocation(LocationKey key) { LocationDAO locationDAO = new LocationDAO(); return WrapMethod(() => locationDAO.CreateLocation(key)); } public Result<Boolean> RemoveLocation(LocationKey key) { LocationDAO locationDAO = new LocationDAO(); return WrapMethod(() => locationDAO.RemoveLocation(key)); } static Result<T> WrapMethod<T>(Func<Result<T>> func) { try { return func(); } catch (UpdateException ue) { return new Result<T>(default(T), ue.Errors); } }
就像是:
public Result<Boolean> RemoveLocation(LocationKey key) { return WrapMethod(() => locationDAO.RemoveLocation(key)); } static Result<T> WrapMethod<T>(Func<T> func) { try { return new Result<T>(func()); } catch (SomeExceptionBase ex) { return new Result<T>(ex.ErrorList); } catch (Exception ex) { return new Result<T>((List<Error>)null); } }
和(显示的最小值)
class Result<T> { private Result(bool isError, T value, List<Error> erors) { } public Result(T value) : this(false, value, null){ } public Result(List<Error> errors) : this(true, default(T), errors) { } } class SomeExceptionBase : Exception { public List<Error> ErrorList { get; private set; } }
(尽管如果我 必须 这样做,我可能会做一些更有趣的事情,但碰巧不是SomeExceptionBase)
SomeExceptionBase