【发布时间】:2019-07-10 21:54:04
【问题描述】:
我正在尝试创建一个接受另一个方法的方法,并返回内部方法返回的值,如果该内部方法不是 void。我想这样做而不区分 Func<> 和 Action<>。
本质上,我希望包装方法的行为与未包装方法完全相同,并加上包装器提供的一些功能。目标很简单,但实现起来很难。
public int ReturnsInteger() {
Console.WriteLine("I return 42");
return 42;
}
public static T WrapperMethod(Func<T> someMethod) {
Console.WriteLine("Wrap start");
var result = someMethod();
Console.WriteLine("Wrap end");
return result;
}
private static void Main() {
var X = WrapperMethod(()=>ReturnsInt());
Console.WriteLine("X = " + X);
// Wrap start
// I return 42
// Wrap end
// X = 42
}
public void ReturnsNothing() {
Console.WriteLine("I return nothing");
return;
}
public static T WrapperMethod(Action someMethod) {
Console.WriteLine("Wrap start");
someMethod();
Console.WriteLine("Wrap end");
}
private static void Main() {
WrapperMethod(()=>ReturnsNothing());
// Wrap start
// I return nothing
// Wrap end
}
【问题讨论】:
-
您将需要对
Action和Func进行重载,但您可以实现Unit类型,以由Actions 的包装器返回。跨度> -
您想出的任何解决方案都将从根本上 更复杂,并且执行起来从根本上 比您这里的解决方案更差。试图概括这一点绝不会简化这一点。只支持两个不同的代表。
-
"我正在尝试创建一个接受另一个方法的方法,并返回内部方法返回的值,如果该内部方法不是 void " -- 我什至不知道那是什么意思。也就是说,如果内部方法的返回类型为
void,那么您不希望您的方法返回一个值吗? C# 不能那样工作。方法总是要么返回一个值,要么不返回一个值……你不能让它们根据参数有条件地返回一个值。 -
这里只满足了一半的要求。为了使它们完整,如果内部方法确实返回
void,您必须指定您期望包装器方法执行的操作。 -
你们都提出了好点。我挣扎了将近一个小时,试图弄清楚如何提出正确的问题,但@PeterDuniho 的回答抓住了问题的要旨。
标签: c# generics methods delegates