我有以下代码:
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
答案 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;
}
}
}