如何调用具有不同返回类型的已实现接口方法?

时间:2019-04-26 13:04:03

标签: c# asp.net-mvc-4

我有一个接口,该接口具有一个带有接口返回类型的方法。 有没有办法在具有不同返回类型(从接口返回类型派生)的不同类中实现该方法?

到目前为止,这是我的代码...

public interface IMainRepository
{
    IMyForm GetForm();
}

public interface IMyForm 
{
    SomeCustomObject myCustomObject { get; set; }
}

public class SecondForm : IMyForm 
{
    public SomeCustomObject myCustomObject { get; set; }
    public AnotherCustomObject anotherCustomObject { get; set; }
}
public class ThirdForm : IMyForm 
{
    public SomeCustomObject myCustomObject { get; set; }
    public ThisIsAnotherCustomObject thisIsAnotherCustomObject { get; set; }
}
public class SecondRepository : IMainRepository
{
    public IMyForm GetForm() 
    {
        var SecondForm form = new SecondForm();
        //Do stuff...
        return form;
    }
}

public class ThirdRepository : IMainRepository
{
    public IMyForm GetForm() 
    {
        var ThirdForm form = new ThirdForm();
        //Do stuff...
        return form;
    }
}

有这个..我可以做些修改,以便得到类似的东西吗?

public class FormController : ApiController 
{
    private readonly IMainRepository mainRepository;

    [System.Web.Http.HttpGet]
        [System.Web.Http.Route(APIRoutes.GET_SECOND_FORM)]           
        public SecondForm GetSecondFormData()
        {           
            return mainRepository.GetForm<SecondForm>();
        }

        [System.Web.Http.HttpGet]
        [System.Web.Http.Route(APIRoutes.GET_THIRD_FORM)]
        public ThirdForm GetThirdFormData()
        {
            return mainRepository.GetForm<ThirdForm>();
        }
}

1 个答案:

答案 0 :(得分:0)

您要尝试执行的操作实际上是代码气味。 GetForm的通用形状意味着我可以用任何IMyForm来调用它,但是那是不可能的,因为您将仅针对特定形式实现该方法。例如,如果我创建一个新的自定义IMyForm并调用您的通用方法-> Crack

public TForm GetForm<TForm>() where TForm : IMyForm, class
{
    // If you do something like this, it's probably a code smell...
    if (typeof(TForm) == typeof(FirstForm)) // return some first form
}

如果您真的很想要该通用方法,则可以尝试使用反射来查找与TForm的指定类型匹配的类型,但是我不建议这样做,因为它会导致很多复杂性。

我建议您采用简单的方法,并提供称为GetFirstFormGetSecondForm等的方法。

public interface IMainRepository
{
    FirstForm GetFirstForm();
    SecondForm GetSecondForm();
    // etc.
}

或使用IMainRepository<TForm>并在控制器中具有多个存储库字段。

public interface IMainRepository<TForm> where TForm : IMyForm, class
{
    TForm GetForm();
}

public class SecondRepository : IMainRepository<SecondForm>
{
    public SecondForm GetForm() 
    {
        var SecondForm form = new SecondForm();
        //Do stuff...
        return form;
    }
}

public class FormController : ApiController 
{
    private readonly IMainRepository<FirstForm> firstFormRepository;
    private readonly IMainRepository<SecondForm> secondFormRepository;

    // etc.
}