我試圖讓所有這些映射器類有一個共同的基礎,當鑄造基地接口:使用協方差和多個通用參數
// base
class BaseInput { public string BaseInputValue { get; set; } }
class BaseOutput { public string BaseOutputValue { get; set; } }
interface IMapper<InputType, out OutputType>
where InputType : BaseInput
where OutputType : BaseOutput
{
OutputType Map(InputType input);
}
// example implementation
class Input : BaseInput { public string InputValue { get; set; } }
class Output : BaseOutput { public string OutputValue { get; set; } }
class MyMapper : IMapper<Input, Output>
{
public Output Map(Input input)
{
// custom mapping done here to Output
return new Output { /* mapping */ };
}
}
此代碼來創建這些映射器的一個新的,並把它分配給基本編譯罰款:
var myBaseMapper = (IMapper<BaseInput, BaseOutput>) new MyMapper();
但我得到一個運行時錯誤:
Unable to cast object of type 'MyMapper' to type 'IMapper`2[UserQuery+BaseInput,UserQuery+BaseOutput]'.
如果我減少IMapper
到IMapper<out OutputType>
它可以正常工作,但是這需要在MyMapper.Map
中進行演員製作,這在每個映射器類中都有點麻煩。此外,這使我失去了決定使用哪個Mapper的信息,因此我不得不在其他地方定義這些信息。
這樣做只是不可能在C#或有沒有辦法做類似的事情嗎?如果不是,我將不得不重新考慮我的設計。
申報'InputType'作爲協變:'接口IMapper <在的inputType,出輸出類型>' – MarcinJuraszek
@MarcinJuraszek'InputType'將是* *逆變在這種情況下 – BradleyDotNET
@MarcinJuraszek我試圖做'<在的inputType,出輸出類型>'之前只是爲了看到,但我得到了同樣的錯誤。順便說一下,我的意思是最初在標題中爲'out'寫'協變'。我混淆了他們。 –