我有很多函式都接受一個類(請求)并回傳一個類(回應),我正在嘗試撰寫一個通用處理程式。
我無法更改我的類的定義JobParametersModel以接受泛型或我的方法DoWorkAsync,但我可以修改其他所有內容。
鑒于這些類:
public class JobRequestModel<Request, Response>
where Request : class
where Response : class
{
public Func<Request, Task<Response>> CallDelegate { get; set; }
public async Task<Response> DoCall(Request request)
{
return await CallDelegate(request);
}
}
public sealed class JobParametersModel
{
// Stores class JobRequestModel and other params
public object RequestModel { get; set; }
}
這是我試圖解決的方法。我怎樣才能讓物件變成我可以與之互動的東西?
// What I'm trying to do, that does not work.
public async Task<JobResultModel> DoWorkAsync(JobParametersModel work, object request)
{
var jobRequestModel = (JobRequestModel)work.RequestModel; // Does NOT work.
// I can cast request using "ChangeType". Simplified code for example
var results = await jobRequestModel.DoCall(request);
// I package/return results later
}
這樣我就可以這樣稱呼它:
var result1 = await DoWorkAsync(
new JobParametersModel()
{
RequestModel = new JobAXRequestModel<CustomRequestType, CustomResponseType>()
{
CallDelegate = _client.getMyCustomDelegate
}
},
new CustomRequestType()
{
CustomField1 = "something",
CustomField2 = 4
}
);
var result2 = await DoWorkAsync(
new JobParametersModel()
{
RequestModel = new JobAXRequestModel<OtherCustomRequestType, OtherCustomResponseType>()
{
CallDelegate = _client.getSomeOtherCustomDelegate
}
},
new OtherCustomRequestType()
{
DifferentField1 = "other things"
}
);
uj5u.com熱心網友回復:
在必須使用預定義簽名實作方法但您需要訪問其他型別的情況下,則存在方法內的鴨子型別選項。
有關參考,請參閱:使用型別動態(C# 編程指南)
在您的示例代碼中,必須使用以下簽名實作以下方法:
Task<JobResultModel> DoWorkAsync(JobParametersModel work, object request)
其中JobParametersModel型別包含object模型:
public object RequestModel { get; set; }
由于您無法更改方法的簽名DoWorkAsync或 的結構JobParametersModel,因此您可以利用動態編程并通過運行時驗證繞過編譯時檢查:
dynamic jobRequestModel = work.RequestModel
最終實施將在哪里:
public async Task<JobResultModel> DoWorkAsync(JobParametersModel work, object request)
{
// cast the the model to a dynamic type
// could also be defined as:
// dynamic jobRequestModel = work.RequestModel
var jobRequestModel = (dynamic)work.RequestModel;
// invoke the method; type checking will only during runtime
var results = await jobRequestModel.DoCall(request);
// other code...
}
只要該方法存在于該dynamic型別上,那么運行時就會執行該方法。但是,如果該方法不存在或具有不同的簽名,則將引發運行時例外。
如果您希望將 a 以外的型別JobRequestModel作為 傳入RequestModel,那么您需要在呼叫方法之前執行額外的檢查以驗證型別(可能像反射一樣簡單以找到匹配的方法)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/519886.html
標籤:C#网仿制药异步等待铸件
上一篇:不同泛型的打字稿陣列
下一篇:模板類的多型性
