C # ищет новый инструмент для панели инструментов, как шаблон этого кода

Все, что у меня есть кое-что, что я пытался сделать какое-то время, и пока не нашел хорошей стратегии для этого, я не уверен, что C # может даже поддержать то, что я пытаюсь сделать.

Пример представьте себе шаблон, подобный этому, повторяемый в всеобъемлющей функции cocept кода менеджера. Возвращает результат, состоящий из флага успеха и списка ошибок.

       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);
        }
    }

Ответы на вопрос(3)

Ваш ответ на вопрос