以编程方式键入对象
C#mvc4项目
我有两个类似的ViewModel,它包含十几个复杂的对象,我想从我的创建和编辑操作中调用一个常用的方法来填充ViewModel。
与此相关的内容
private void loadMdlDtl(CreateViewModel cvM, EditViewModel evM)
{
If (vM1 != null) { var vM = vM1}
If (vM2 != null) { var vM = vM2}
// about two dozen complex objects need to be populated
vM.property1 = …;
vM.property2 = …;
…
}
这不起作用,因为vM
不在范围内。
有没有办法以编程方式键入vM
对象,这样我就不必创建两个loadModel方法或者复制大量代码?
SOLUTION:
创建一个界面:
public interface IViewModels
{
string property1 { get; set; }
int property2 { get; set; }
IEnumerable<ValidationResult> Validate(ValidationContext validationContext);
}
让View Models继承自interface:
public class CreateViewModel : IViewModels, IValidatableObject
{
string property1 { get; set; }
int property2 { get; set; }
IEnumerable<ValidationResult> Validate(ValidationContext validationContext);
{
// implementation
}
}
public class EditViewModel : IViewModels, IValidatableObject
{
string property1 { get; set; }
int property2 { get; set; }
IEnumerable<ValidationResult> Validate(ValidationContext validationContext);
{
// implementation
}
}
从传递视图模型的操作中调用方法:
public ActionResult Create()
{
var vM = new CreateViewModel();
...
loadMdlDtl(vM);
...
}
但现在接受接口而不是View Model进入方法:
private void loadMdlDtl(IViewModel vM)
{
// implementation
}
答案 0 :(得分:4)
由于您要访问所有对象中相同的属性和/或方法,因此可以使用此类属性和方法定义接口。让每个对象实现该接口。
public interface IMyCommonStuff
{
string property1 { get; set; }
int property2 { get; set; }
int SomeMethod();
}
<强>更新强>
如果某些方法和/或属性具有相同的实现,则可以在公共基本类型中完成该实现。我建议在处理对象时仍然使用接口定义。例如:
public class MyCommonImplementation : IMyCommonStuff
{
public virtual int SomeMethod()
{
// Implementation goes here.
}
public string property1 { get; set; }
public int property2 { get; set; }
}
public class MyConcreteSubclass : MyCommonImplementation, IMyCommonStuff
{
// Add only the things that make this concrete subclass special. Everything
// else is inherited from the base class
}
答案 1 :(得分:1)
Eric的回答是标准的做法,但如果您想节省时间,可以使用dynamic
关键字来定义vM
,例如:
dynamic vM;
if (vM1 != null) vM = vM1;
if (vM2 != null) vM = vM2;
//about two dozen complex objects need to be populated
vM.property1 = …;
vM.property2 = …;
…