と呼ばれる静的クラスStaticHelper
には、次の汎用static
メソッドがあります。
public static class StaticHelper
{
public static TResponse GenericMethod<TResponse, TRequest>(TRequest request,
Func<TRequest, TResponse> method)
where TRequest : BaseRequest
where TResponse : BaseResponse, new()
{
// ...
}
Func<TRequest, TResponse> method
によって呼び出されるメソッドの名前ですGenericMethod
。GenericMethod
要求/応答などをログに記録するためのWCFメソッドのラッパーとして使用されます。
public override SomeCustomResponse Request(SomeCustomRequest request)
{
// GenericMethod above called here
return StaticHelper.GenericMethod(request, ExecuteRequest));
}
private SomeCustomResponse ExecuteRequest(SomeCustomRequest request)
{
// ...
}
私は今async
それと同等のものを作成しようとしています:
public static async Task<TResponse> GenericMethodAsync<TResponse, TRequest>(TRequest request,
Func<TRequest, TResponse> method)
where TRequest : BaseRequest
where TResponse : BaseResponse, new()
{
// ...
}
// i have removed the override keyword here as I don't need it
public async Task<SomeCustomResponse> Request(SomeCustomRequest request)
{
// GenericMethodAsync above called here
return await StaticHelper.GenericMethodAsync(request, ExecuteRequest));
}
private async Task<SomeCustomResponse> ExecuteRequest(SomeCustomRequest request)
{
// ...
}
これは2つのエラーになります:
public async Task<SomeCustomResponse> Request(SomeCustomRequest request)
(第2の非同期メソッド):
1)この型
Task<SomeCustomResponse>
はTResponse
、ジェネリック型またはメソッド 'StaticHelper.GenericMethodAsync<TResponse, TRequest>(TRequest, Func<TRequest, TResponse>)
'の型パラメーター ' 'として使用できません。からTask<SomeCustomResponse>
への暗黙の参照変換はありませんBaseResponse
...そして:
2)ジェネリック型またはメソッドで
Task<SomeCustomResponse>
パラメーター 'TResponse
'として使用するには、パブリックパラメーターなしコンストラクターを持つ非抽象型である必要がありますStaticHelper.GenericMethodAsync<TResponse, TRequest>(TRequest, Func<TRequest, TResponse>)
更新:以下のRenéによる回答により、エラーが消えます。私は今新しいものを持っています:
タイプ '
Task<TResponse>
'を 'TResponse
'に暗黙的に変換することはできません
問題のある行はStaticHelper.GenericMethodAsync
、Func
:を実行しようとする行です。
var response = method(request); // <-- Cannot implicitly convert type 'Task<TResponse>' to 'TResponse'
...そして明らかに、解決策は単純にawait
それです:
var response = await method(request);
()のGenericMethodAsync
戻り値の型が:の代わりになっているため、の宣言を変更する必要があります。method
ExecuteRequest
Task<TResponse>
TResponse
public static async Task<TResponse> GenericMethodAsync<TResponse, TRequest>(
TRequest request,
Func<TRequest, Task<TResponse>> method) // <-- change here
where TRequest : BaseRequest
where TResponse : BaseResponse, new()
{
// ...
}
また、名前ExecuteRequest
をに変更することExecuteRequestAsync
も検討してください。
そしてもちろん、それに応じてmethod
内部の使用法を変更する必要がありGenericMethodAsync
ます。
var response = await method(request);
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加