2012-02-28 2 views
1

Я ищу способ назначения базовой части производного класса из переменной базового класса без необходимости однозначно присваивать каждому присваиваемому свойству один за другим. Иными словами: начиная с переменной базового класса, я бы хотел получить переменную производного класса, которая имеет все назначаемые базовые свойства, не задумываясь о том, что они собой представляют, или редактировать код, если они изменение.присвоение базовой части производного класса

Я создаю модели представления как производные классы из базового класса Entity, который будет редактироваться. Обычно это просто добавить идентификаторы для свойств навигации, чтобы они могли быть возвращены POST. Например:

public class ThingEditView : Thing 
{ 
    public int UsefulID { get; set; } 
} 

Он привыкает, как это:

var foo = new ThingEditView 
{ 
    UsefulID = thisThing.Useful.ID, 
    A = thisThing.A, 
    B = thisThing.B, 
    /* and potentially many more properties from the base class Thing */ 
}; 
return View(foo); 

Но, я бегу в проблему, когда я добавляю свойства базового класса Thing и забудьте изменить все места, где я инициализировать ThingEditView или ThingDetailView и т.д. Я хотел бы быть в состоянии сказать

var foo = new ThingEditView 
{ 
    base = thisThing, 
    UsefulID = thisThing.Useful.ID 
}; 

и пусть фигурка компилятора, какие поля для назначения. Есть ли способ сделать это?

Спасибо за понимание!

+2

Возможно, [AutoMapper] (http://automapper.org/) может вам помочь. –

+0

Согласен, что-то вроде Automapper - единственный способ – swannee

+0

Спасибо, Андре (bedanke mich) и Эрик. AutoMapper кажется немного тяжелее, чем я хотел, хотя, возможно, это именно то, что мне нужно. Странно, что нет прямого способа сказать это на C#. В C-дни я буду стремиться к 'memcpy (... sizeof (Thing))'. –

ответ

2
void Main() 
{ 
    var thisThing= new ThingEditView {UsefulID = 1, A = 2, B = 3}; 
    var foo = new ThingEditView(thisThing); 

    //foo.Dump(); 
} 

// Define other methods and classes here 
public class Thing 
{ 
    public int A {get; set;} 
    public int B {get; set;}   
    public Thing() {} 
    public Thing(Thing thing) 
    {  
    this.A = thing.A; 
    this.B = thing.B; 
    } 
} 

public class ThingEditView : Thing 
{ 
    public int UsefulID {get; set;} 
    public ThingEditView() {} 
    public ThingEditView(Thing thing) : base(thing) { 

    } 
    public ThingEditView(ThingEditView view) : base(view) { 
     this.UsefulID = view.UsefulID; 
    } 
} 

Я бы выбрал для automapper.

+0

Спасибо, Адриан. Это хорошо, но для этого требуется, чтобы конструктор для ThingEditView редактировался для отслеживания любых изменений в 'Thing'. –

+0

Я не уверен, понимаю ли я. Конструктор Thing отвечает за копирование своих собственных свойств и помогает наследователям называть этот код базой (вид) –

+1

Не стоит беспокоиться ... Я медленный на своем пути. Это точно, что я ищу. Благодаря!! –

Смежные вопросы