我的界面有问题,我不确定如何解决。
这是场景:
// IApplicationForm does nothing other than ensure it's an
// application form.
public class MortgageApplicationForm : IApplicationForm {}
internal interface IDataAdapter
{
StringContent FormatOutput<TForm>(TForm form) where TForm : IApplicationForm;
}
internal class DataAdapter : IDataAdapter
{
public StringContent FormatOutput<TForm>(MortgageApplicationForm form)
where TForm : IApplicationForm
{
return new StringContent("", Encoding.UTF8, MediaType.Json.Description());
}
}
DataAdapter
是MortgageApplicationForm
的非通用DataAdapter,所以我想对IApplicationForm
方法使用具体的类而不是FormatOutput
接口。 / p>
但是,我收到一条消息,说IDataAdapter
没有实现带有该签名的方法。
我知道<TForm>(TForm form)
与<TForm>(MortgageApplicationForm form)
不同,但我认为这是可以接受的,因为MortgageApplicationForm
实现了IApplicationForm
接口。
我错了-任何建议都值得赞赏。
更新
Scott的解决方案是正确的,但是在这种情况下不起作用,因为使用Reflection实例化DataAdapter的方式是
public static IDataAdapter GetDataAdapter(string apiKey)
{
return (IDataAdapter)Activator.CreateInstance(
Type.GetType($"My.Base.Namespace.{apiKey}.DataAdapter.cs"));
}
答案 0 :(得分:2)
看起来您想要做的是这样
internal interface IDataAdapter<TForm> where TForm : IApplicationForm
{
StringContent FormatOutput(TForm form);
}
internal class MortgageApplicationFormAdapter : IDataAdapter<MortgageApplicationForm>
{
public StringContent FormatOutput(MortgageApplicationForm form)
{
return new StringContent("", Encoding.UTF8, MediaType.Json.Description());
}
}
您要指定MortgageApplicationForm
作为表单类型,这表明该接口的每个实现也都适用于特定的表单类型。
如果您想要一个适用于任何表单类型的实现,则通用参数将位于方法上。如果您希望每个实现都处理特定的表单类型,则将在接口本身上使用通用参数。