c# - 具有相似体的通用和非通用方法

标签 c# generics optimization

我有一个方法叫 ExecuteAsyncServiceRequest使用重载,您会注意到这两种方法的主体是相似的。我发现自己想知道有没有更简洁的方法来编写这些方法?具体来说,不必在方法体中重复自己。

提前致谢!

    /// <summary>
    /// Executes an async service request which returns a response of type TResponse
    /// </summary>
    /// <param name="execute">The service request to execute</param>
    /// <param name="success">Callback when the service request is successful</param>
    /// <param name="failure">Callback when the service request fails</param>
    /// <typeparam name="TResponse">Type of the expected ServiceResult returned from the async request</typeparam>
    protected async void ExecuteAsyncServiceRequest<TResponse>(Func<Task<ServiceResult<TResponse>>> execute,
                                                            Action<TResponse> success,
                                                            Action<string> failure)
    {
        ServiceResult<TResponse> result = await execute();

        if (result.ResultCode == ServiceResult.ServiceResultCode.Failed)
            failure(result.FailureDetails);

        success(result.Response);    
    }

    /// <summary>
    /// Executes an async service request
    /// </summary>
    /// <param name="execute">The service request to execute</param>
    /// <param name="success">Callback when the service request is successful</param>
    /// <param name="failure">Callback when the service request fails</param>       
    protected async void ExecuteAsyncServiceRequest(Func<Task<ServiceResult>> execute,
                                                    Action success,
                                                    Action <string> failure)
    {
        ServiceResult result = await execute();

        if (result.ResultCode == ServiceResult.ServiceResultCode.Failed)
            failure(result.FailureDetails);

        success();
    }

最佳答案

不。不幸的是,这是由于 .NET 本身的类型系统的限制 - 特别是,void不是一种类型。

具有更多功能影响的语言(相对于经典的 OOP)往往没有 void 的概念。 ;相反,存在具有单个值的特殊类型(通常称为 unit )。像这样的东西:

public sealed class Unit {
  private Unit() { }
  public static Unit Instance { get; } = new Unit();
}

你可以用你的代码做一些类似的事情,但这取决于你是否值得:
protected async void ExecuteAsyncServiceRequest(Func<Task<ServiceResult>> execute,
                                                Action success,
                                                Action <string> failure) =>
    ExecuteAsyncServiceRequest(
        async () => new ServiceResult<Unit>(await execute(), Unit.Instance),
        _ => success(),
        failure);

这是假设 ServiceResult<T>可以有一个(可能是 internal )构造函数,它接受 ServiceResult作为参数并复制其所有属性,除了从第二个构造函数参数复制的实际“结果”。

关于c# - 具有相似体的通用和非通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45618588/

相关文章:

c# - 从 DbContext 中检索未提交的实体

java - 使用嵌套在另一个扩展 Comparable 的类中的类覆盖compareTo 方法

generics - 使用标准的 haskell 泛型库进行类型化类型同构

python - 执行笛卡尔积时如何减少内存消耗?

python - 如何找到将 N 个观察值分配到 M 个组的最佳方法?

c# - NHibernate 多对多映射不起作用

c# - 如何解码 RTP 数据包并将其保存为 .wav 文件

c# - .net 消息队列

c# - 多泛型歧义

mysql - 将归档的 SQL 记录转换为规范化结构的长期影响是什么?