类未实现接口方法

时间:2019-06-07 14:38:26

标签: c# asp.net interface

我的界面有问题,我不确定如何解决。

这是场景:

// 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());
    }
}

DataAdapterMortgageApplicationForm的非通用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"));
    }

1 个答案:

答案 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作为表单类型,这表明该接口的每个实现也都适用于特定的表单类型。

如果您想要一个适用于任何表单类型的实现,则通用参数将位于方法上。如果您希望每个实现都处理特定的表单类型,则将在接口本身上使用通用参数。