我有一个接口,该接口具有一个带有接口返回类型的方法。 有没有办法在具有不同返回类型(从接口返回类型派生)的不同类中实现该方法?
到目前为止,这是我的代码...
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>();
}
}
答案 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
的指定类型匹配的类型,但是我不建议这样做,因为它会导致很多复杂性。
我建议您采用简单的方法,并提供称为GetFirstForm
,GetSecondForm
等的方法。
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.
}