c# - 将方法包装到函数中

标签 c# generics delegates func polly

我想围绕 Polly 框架创建一个通用包装器,以便可以有单一实现。为了实现它我写了下面的代码

    private Policy GetPolicy(EType eType)
    {
        var policy = default(Polly.Policy);

        switch (eType)
        {                

            case EType.T:
                policy = Policy.Handle<SomeException>().Retry(n, x => new TimeSpan(0, 0, x));
                break;                
        }
        return policy;
    }  

我在我的一个包装方法中使用上述方法

   public TOutput Execute<TOutput>(Func<TOutput> func, EType eType)
    {
        var policy = GetPolicy(eType);

        return policy.Execute(() => func());
    }

现在为了使用它,我编写了一个示例方法

       var handleError = new HandleError();
        var connection = handleError.Execute(() => factory.CreateConnection(), ExceptionType.Transient);

直到上面一切正常,但是一旦我开始在带有参数的方法中调用相同的方法,它就会抛出错误

     var handleError = new HandleError();
        handleError.Execute(() => channel.ExchangeDeclare(queueDetail.ExchangeName, ExchangeType.Fanout), ExceptionType.Transient);

     The type arguments for method 'HandleError.Execute<TOutput>(Func<TOutput>, ExceptionType)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

最佳答案

您需要两个 Execute 重载,一个用于返回值的函数,另一个用于不返回值的函数:

public TOutput Execute<TOutput>(Func<TOutput> func, ExceptionType exceptionType)
{
    var policy = GetPolicyFromExceptionType(exceptionType);
    return policy.Execute(func);
}

public void Execute(Action action, ExceptionType exceptionType)
{
    var policy = GetPolicyFromExceptionType(exceptionType);
    policy.Execute(action);
}

然后你可以在那里传递任何东西,包括带参数的函数:

// calls first overload
Execute(() => ImReturningValue(parameter1));
// calls second
Execute(() => IDoNot(parameter1));

Policy.Execute 方法也具有相同的重载(一个用于 Func,一个用于 Action) - 因此将任一重载传递给它都不会出现问题。

关于c# - 将方法包装到函数中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47696368/

相关文章:

C# Delegate -- 如何首先将具有不同参数的多个函数(相同类型)绑定(bind)到一个委托(delegate),然后再触发/调用它们?

c# - Action<T> vs 匿名方法问题

objective-c - self 释放后

c# - WPF中使用INotifyPropertyChanged绑定(bind)系统相关信息

c# - 如何在 C#/.NET 中找到本地计算机的 FQDN?

c# - 在 WPF 中模拟 Enter 键

c# - 自动将 Interface<T> 解析为 StructureMap 中的 Implementation<T>(仅泛型类型 T 不同)

c# - 我怎样才能调用构造函数?

c# - 如何替换 .NET Core 3.0 中的 AddJwtBearer 扩展

java - 是否可以在通用接口(interface)中使用枚举