我有一个方法叫 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/