返回类型简单的通用调用

时间:2019-11-28 10:33:20

标签: c# lambda

我目前正在尝试创建一个通用调用,该通用调用需要一个传入的函数需要返回的值。这似乎是一个简单的通用方法,但是我一生无法确定找出为什么它不起作用。

我想要做的是将一个方法传递给该方法,以便它可以调用和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”

2 个答案:

答案 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));