我目前正在尝试创建一个通用调用,该通用调用需要一个传入的函数需要返回的值。这似乎是一个简单的通用方法,但是我一生无法确定找出为什么它不起作用。
我想要做的是将一个方法传递给该方法,以便它可以调用和API并处理遇到的任何错误。我想将gRPC调用传递给该方法,将其包装在try catch中,然后调用并捕获任何错误。我认为通用将是实现此目标的最佳方法,但它似乎没有用。如果有人对哪种方法更好的建议,我全神贯注。
我想出的通用调用非常简单:
public T MakeCall<T>(Func<T> calling)
{
var res = calling.Invoke();
return res;
}
调用代码如下
static void Main(string[] args)
{
var caller = new Caller();
caller.MakeCall<int>(Add(1, 2));
Thread.Sleep(Timeout.Infinite);
}
public static int Add(int one, int two)
{
return one + two;
}
这给我一个错误,提示
“ int不可分配给参数类型System.Func”
答案 0 :(得分:4)
好吧
MakeCall<int>(Add(1, 2))
表示“ 执行 Add(1, 2)
,然后调用MakeCall<int>
并返回结果(int
)”。您应该放置Func<int>
而不是int
:
MakeCall<int>(() => Add(1, 2))
这里
() => Add(1, 2)
是一个Func<int>
,它什么也不做,并返回Add(1, 2)
结果
答案 1 :(得分:2)
因为Add()
返回int
,而int
不是Func<T>
。您可以使用() => Add(1,2)
作为参数。
因此解决方案将是
caller.MakeCall<int>(() => Add(1, 2));