以编程方式键入对象

时间:2013-12-17 03:02:04

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

以编程方式键入对象

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
}

2 个答案:

答案 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 = …;
…