泛型函数的 C# 扩展方法
C# Extension Methods for Generic Functions
我想创建一个简单的单行 try/catch 没有所有多余的绒毛:
// The extension class
public static class TryExFunc
{
public static Exception TryEx<TResult> (this Func<TResult> func,
out TResult result)
{
Exception error = null;
try
{
result = func();
}
catch(Exception ex)
{
error = ex;
result = default(TResult);
}
return error;
}
}
// My Error Prone Function
public string SayHello() { throw new Exception(); }
// My Code
// One (ok, two) line(s) to try/catch a function call... ew, works, but ew
string result;
Exception error = ((Func<string>)SayHello).TryEx<string>(out result);
// I want to do this!!!
string result;
Exception error = SayHello.TryEx<string>(out result);
有什么方法可以做下面的例子吗?我还在学习 C#(来自 Lua 和 C++ 背景)。 Lua 有一个非常好的函数,叫做 'pcall',它基本上做同样的事情。感谢您的任何意见或建议!
:)
你不能。因为 method group
没有类型。它可以转换为不同的 delegate
类型。所以你必须在使用它之前将它转换为 delegate 类型。
如果你想避免转换,你可以这样做:
Func<string> sayHello = SayHello;
Exception error = sayHello.TryEx<string>(out result);
它不能用作扩展方法,因为为了使用扩展方法,C# 首先需要知道要扩展的类型,并且正如@Selman22 所述,SayHello 是一个可能具有其他重载的方法组,所以我们不知道类型。
它作为方法调用工作,因为 C# 可以看到所需的参数是 Func<T>
并且 SayHello 是有效的 Func<T>
下面的格式可以调用函数。
string result;
Exception error = TryExFunc.TryEx(SayHello, out result);
我同意@Enigmativity 的观点,您可能不应该以这种方式处理异常。
我想创建一个简单的单行 try/catch 没有所有多余的绒毛:
// The extension class
public static class TryExFunc
{
public static Exception TryEx<TResult> (this Func<TResult> func,
out TResult result)
{
Exception error = null;
try
{
result = func();
}
catch(Exception ex)
{
error = ex;
result = default(TResult);
}
return error;
}
}
// My Error Prone Function
public string SayHello() { throw new Exception(); }
// My Code
// One (ok, two) line(s) to try/catch a function call... ew, works, but ew
string result;
Exception error = ((Func<string>)SayHello).TryEx<string>(out result);
// I want to do this!!!
string result;
Exception error = SayHello.TryEx<string>(out result);
有什么方法可以做下面的例子吗?我还在学习 C#(来自 Lua 和 C++ 背景)。 Lua 有一个非常好的函数,叫做 'pcall',它基本上做同样的事情。感谢您的任何意见或建议!
:)
你不能。因为 method group
没有类型。它可以转换为不同的 delegate
类型。所以你必须在使用它之前将它转换为 delegate 类型。
如果你想避免转换,你可以这样做:
Func<string> sayHello = SayHello;
Exception error = sayHello.TryEx<string>(out result);
它不能用作扩展方法,因为为了使用扩展方法,C# 首先需要知道要扩展的类型,并且正如@Selman22 所述,SayHello 是一个可能具有其他重载的方法组,所以我们不知道类型。
它作为方法调用工作,因为 C# 可以看到所需的参数是 Func<T>
并且 SayHello 是有效的 Func<T>
下面的格式可以调用函数。
string result;
Exception error = TryExFunc.TryEx(SayHello, out result);
我同意@Enigmativity 的观点,您可能不应该以这种方式处理异常。