我有各種方法可以做同樣的事情。附在代碼下方:
private async Task<CheckResponse> ManageCheckResponseError(string code)
{
await LogErrorResponseAsync(new { StatusCode = code });
return CheckResponse.GetError(code.ToString());
}
private async Task<BalanceResponse> ManageBalanceResponseError(string code)
{
await LogErrorResponseAsync(new { StatusCode = code });
return BalanceResponse.GetError(code.ToString());
}
private async Task<DebitResponse> ManageDebitResponseError(string code)
{
await LogErrorResponseAsync(new { StatusCode = code });
return DebitResponse.GetError(code.ToString());
}
private async Task<CreditResponse> ManageCreditResponseError(string code)
{
await LogErrorResponseAsync(new { StatusCode = code });
return CreditResponse.GetError(code.ToString());
}
private async Task<CancelResponse> ManageCancelResponseError(string code)
{
await LogErrorResponseAsync(new { StatusCode = code });
return CancelResponse.GetError(code.ToString());
}
這些類的一個例子如下。除了明顯不同的屬性之外,所有這些都是以相同的方式制造的:
public class SampleResponse : ICommonResponseOperations<SampleResponse>
{
// Props
// Error Management
public ErrorModel ErrorModel { get; set; }
public static LoginResponse GetError(string code)
{
return new LoginResponse
{
Entry = "",
EntryEmbedded = "",
ErrorModel = ErrorModel.GetError(code)
};
}
}
有沒有辦法通過泛型使代碼更優雅來標準化一切?謝謝
uj5u.com熱心網友回復:
在下一版本的 C# (11) 中,您將能夠定義介面的靜態成員。
您可以在最新版本的 Visual Studio 2022 中通過將以下內容添加到專案檔案(假設為 .NET 6.0)中進行嘗試:
<EnablePreviewFeatures>True</EnablePreviewFeatures>
<LangVersion>preview</LangVersion>
之后,您可以ICommonResponseOperations
使用靜態成員修改您的界面,如下所示:
public interface ICommonResponseOperations<out TLoginResponse>
{
static abstract TLoginResponse GetError(string code);
// ... Other members
}
(您可能需要洗掉out
取決于TLoginResponse
型別在界面中的使用方式。)
然后你可以像這樣定義一個通用的泛型方法:
private async Task<TLoginResponse> ManageResponseError<TLoginResponse>(string code) where TLoginResponse : ICommonResponseOperations<TLoginResponse>
{
await LogErrorResponseAsync(new { StatusCode = code });
return TLoginResponse.GetError(code);
}
然后代替:
private async Task<BalanceResponse> ManageBalanceResponseError(string code)
{
await LogErrorResponseAsync(new { StatusCode = code });
return BalanceResponse.GetError(code.ToString());
}
您可以直接呼叫ManageResponseError<BalanceResponse>(code)
而無需指定單獨的呼叫方法。
當然,C#11 還沒有推出,這個功能也不能保證能成功,但看起來很有可能。
您還可以使用 C#10 稍微簡化一些事情。
您可以撰寫一個泛型方法,該方法接受一個Func<string, TLoginResponse>
可以呼叫以回傳必要物件的方法:
public async Task<TLoginResponse> ManageResponseError<TLoginResponse>(
string code,
Func<string /*code*/, TLoginResponse> getError)
where TLoginResponse : ICommonResponseOperations<TLoginResponse>
{
await LogErrorResponseAsync(new { StatusCode = code });
return getError(code);
}
然后您可以呼叫該方法而無需顯式指定泛型型別:
await ManageResponseError("some code", SampleResponse.GetError);
泛型型別是從呼叫站點傳入的 lambda 型別推斷出來的。甚至 lambda 本身 ( code => SampleResponse.GetError(code)
) 也是推斷出來的,因此您只需要指定SampleResponse.GetError
.
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/495744.html
下一篇:如何使用通過嵌入泛型實作的介面