Рефакторинг с дженериками и делегатами - PullRequest
0 голосов
/ 14 февраля 2012

У меня есть следующий код:

Type1 Method1(Type2 p)
{
    try
    {
        return DoSomething(p)
    }
    catch{ExceptionType1}
    {
    }
    catch{ExceptionType2}
    {
    }
    catch{ExceptionType3}
    {
    }
}

Type3 Method2(Type4 p)
{
    try
    {
        return DoSomethingElse(p)
    }
    catch{ExceptionType1}
    {
    }
    catch{ExceptionType2}
    {
    }
    catch{ExceptionType3}
    {
    }
}

Как я могу рефакторинг этого кода, чтобы иметь что-то вроде:

TResult ExceptionalMethod(Methodx(T)){
    try
    {
        return Methodx(T);
    }
    catch{ExceptionType1}
    {
    }
    catch{ExceptionType2}
    {
    }
    catch{ExceptionType3}
    {
    }
}

Спасибо, Adrya

Ответы [ 4 ]

1 голос
/ 14 февраля 2012

Это будет работать:

TResult ExceptionalMethod<T, TResult>(Func<T, TResult> methodx, T parameter){
   try
   {
      return methodx(parameter);
   }
   catch(ExceptionType1)
   {
   }
   catch(ExceptionType2)
   {
   }
   catch(ExceptionType3)
   {
   }

   return default(TResult);
}

Надеюсь, вы сделаете что-то полезное в этих уловах.

EDIT
Если в вашей версии фреймворка нет делегата Func<T, TResult>, вы можете легко добавить его, ничего особенного:

public delegate TResult Func<T, TResult>(T arg);
0 голосов
/ 14 февраля 2012

Это полный пример того, что вы хотите сделать, используя делегатов и Func:

using System;

namespace GenericsDelegates
{
    class Program
    {
        static void Main(string[] args)
        {
            string test1 = ExceptionalMethod(TestMethod1, "test");
            string test2 = ExceptionalMethod(TestMethod2, "test");

            Console.WriteLine(test1);
            Console.WriteLine(test2);
        }

        public static TResult ExceptionalMethod<T, TResult>(Func<T, TResult> func, T param)
        {
            return func(param);
        }

        public static string TestMethod1(string param)
        {
            return "TestMethod1-" + param;
        }

        public static string TestMethod2(string param)
        {
            return "TestMethod2-" + param;
        }
    }
}
0 голосов
/ 14 февраля 2012
TResult ExceptionalMethod<TResult>(Action<T> action)){
{
   ...
}
0 голосов
/ 14 февраля 2012

Звучит так, как вы хотите:

TResult ExceptionalMethod<TSource, TResult>(Func<TSource, TResult> func,
                                            TSource input)
{
    try
    {
        return func(input);
    }
    catch(ExceptionType1) {}
    catch(ExceptionType2) {}
    catch(ExceptionType3) {}
    return default(TResult);
}

Однако вам также следует пересмотреть перехват исключений и их проглатывание следующим образом - ваш реальный код делает с ними что-то полезное, например, ведение журнала?

Обратите внимание на оператор return в конце - это может быть неуместно, но если вы ловите эти исключения, вам придется вернуть что-то .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...