使用泛型和委托进行重构

时间:2012-02-14 13:35:59

标签: c# delegates

我有以下代码:

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 个答案:

答案 0 :(得分:1)

这样可行:

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

   return default(TResult);
}

我希望你能在这些捕获中做一些有用的事情。

修改
如果您的框架版本中没有Func<T, TResult>委托,您可以轻松添加它,没有什么特别之处:

public delegate TResult Func<T, TResult>(T arg);

答案 1 :(得分:0)

听起来你只是想要:

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

但是,您还应该重新考虑捕获异常并像这样吞下它们 - 您的真实代码是否对它们有用,例如记录?

注意最后的return语句 - 这可能是不合适的,但是如果你捕获这些例外,你将不得不返回某些东西

答案 2 :(得分:0)

TResult ExceptionalMethod<TResult>(Action<T> action)){
{
   ...
}

答案 3 :(得分:0)

这是一个完整的示例,可以使用委托和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;
        }
    }
}