环境:MVC4C#VS2010
问题:我有一个接口,我正在考虑我的"基本"接口,定义如下:
public interface ITestModel
{
TestViewModel model { get; set; }
void PopulateNewReferralRequestModel(Int32 ReferralTypeID, Int32 profileid, string UniqueKeyValues);
void Save();
}
[MetadataType(typeof(MetaData_TestViewModel))]
public partial class TestViewModel
{
public Int32 id { get; set; }
public string name { get; set; }
public string comments { get; set; }
}
public class MetaData_TestViewModel
{
[Required(ErrorMessage = "ID is required")]
[DisplayName("Primary Key")]
public Int32 id { get; set; }
[Required(ErrorMessage = "Name is required")]
[DisplayName("New Name")]
public string name { get; set; }
[DisplayName("Comments")]
public string comments { get; set; }
}
使用界面:
如果我做了以下事情,一切都会如我所愿:
public class BaseViewModel : ITestModel
{
private TestViewModel _model;
public TestViewModel model
{
get { return _model; }
set { _model = value; }
}
public void PopulateNewReferralRequestModel(Int32 ReferralTypeID, Int32 profileid, string UniqueKeyValues)
{
model = new TestViewModel();
model.id = ReferralTypeID;
model.name = "TEst";
model.comments = "This is a comment";
}
public void Save()
{
int i = 1;
return;
}
}
现在我想继承"基本"接口,但用从TestViewModel继承的定义更改模型属性的定义,如下所示:
public interface ITestModelB : ITestModel
{
new TestViewModelB model { get; set; }
}
public class TestViewModelB : TestViewModel
{
public int anotherfield { get; set; }
public string anotherstringfield { get; set; }
}
并使用如下界面:
public class AViewModel : ITestModelB
{
private TestViewModelB _model;
public TestViewModelB model
{
get
{
return _model;
}
set
{
_model = value;
}
}
public void PopulateNewReferralRequestModel(Int32 ReferralTypeID, Int32 profileid, string UniqueKeyValues)
{
model = new TestViewModelB();
model.comments = "New model created";
model.id = 1;
model.name = "Referral Type 1";
model.anotherfield = profileid;
model.anotherstringfield = UniqueKeyValues;
}
public void Save()
{
int i = 1;
return;
}
}
问题是当我构建时,我得到了以下错误:
Error 1 'InterfaceTest.Models.AViewModel' does not implement interface member 'InterfaceTest.Models.ITestModel.model'. 'InterfaceTest.Models.AViewModel.model' cannot implement 'InterfaceTest.Models.ITestModel.model' because it does not have the matching return type of 'InterfaceTest.Models.TestViewModel'.
我为什么要这样做:
我正在尝试建立一个推荐系统,在该系统中,所有推荐都具有相同的基本属性和操作。每个推荐类型还具有特定于该推荐类型的属性和操作。我希望转介通过相同的控制器,这样当添加新的转介时,我只需要创建一个新的接口来处理转介。
以下是我想在我的控制器中做的事情:
ITestModel model = businessLogic.GetModel(referraltypeid);
model.PopulateNewReferralRequestModel(1, 1234, "DRC Policy, 12345678, 2/14/2014");
我会在businessLogic类中使用一个方法,根据引用类型来确定返回哪个模型类型。所有模型都将实现ITestModel接口。这样做可以让我通过同一个控制器处理所有的转介,而不必为每种转介类型都有多个控制器。
我需要什么有人能告诉我如何克服我在构建时遇到的错误吗?或者为我想要实现的目标提出另一个解决方案吗?
非常感谢您的帮助!
您可以使用显式接口实现来消除编译错误
public class AViewModel : ITestModelB
{
private TestViewModelB _model;
public TestViewModelB model
{
get
{
return _model;
}
set
{
_model = value;
}
}
private TestViewModel newmodel;
TestViewModel ITestModel.model
{
get { return newmodel; }
set { newmodel = value; }
}
public void PopulateNewReferralRequestModel(Int32 ReferralTypeID, Int32 profileid, string UniqueKeyValues)
{
model = new TestViewModelB();
model.comments = "New model created";
model.id = 1;
model.name = "Referral Type 1";
model.anotherfield = profileid;
model.anotherstringfield = UniqueKeyValues;
}
public void Save()
{
int i = 1;
return;
}
}
或者可以使用通用接口
public interface ITestModel<Tmodel>
{
Tmodel model { get; set; }
void PopulateNewReferralRequestModel(Int32 ReferralTypeID, Int32 profileid, string UniqueKeyValues);
void Save();
}