Программный тип объекта

60
9

Программный тип объекта

Проект С# mvc4

У меня есть две аналогичные модели ViewModels, которые содержат более десятка сложных объектов, которые я хочу назвать общим методом из моих команд Create и Edit для заполнения ViewModels.

Что-то вроде этого

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 в объем.

Есть ли способ программировать тип объекта vM чтобы мне не приходилось создавать два метода loadModel или иначе дублировать много кода?

РЕШЕНИЕ:

Создание интерфейса:

public interface IViewModels
{
string property1 { get; set; }
int property2 { get; set; }
IEnumerable<ValidationResult> Validate(ValidationContext validationContext);
}

У модели наследования унаследовать от интерфейса:

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
}
}

Вызовите метод из Actions, проходящего через View Model:

public ActionResult Create()
{
var vM = new CreateViewModel();
...
loadMdlDtl(vM);
...
}

Но теперь примите интерфейс, а не View Model в метод:

private void loadMdlDtl(IViewModel vM)
{
// implementation
}

спросил(а) 2013-12-17T06:02:00+04:00 6 лет, 11 месяцев назад
1
Решение
59

Ответ Эрика - это стандартный способ сделать это, но если вы хотите сэкономить время, вы можете использовать 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 = …;

ответил(а) 2013-12-17T06:07:00+04:00 6 лет, 11 месяцев назад
94

Поскольку вы хотите получить доступ к свойствам и/или методам, одинаковым для всех объектов, вы можете определить интерфейс с такими свойствами и методами. Пусть каждый объект реализует этот интерфейс.

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
}

ответил(а) 2013-12-17T06:05:00+04:00 6 лет, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема