2013-11-12 3 views
1

Как установить все свойства объекта равными другим? Как и в моем примере, TCar - это в основном автомобиль, как я могу установить общие переменные равными? На Java, если я правильно помню, я могу сделать это легко.C# Установка параметров объекта

class Car { 

} 

class TCar : Car { 

} 

Car car = new Car(); 
TCar datcar = new TCar(); 
datcar = car; Error? Isn't the datcar is a 'Car' too? 

Я не хочу вручную устанавливать все.

+0

Вы можете определить конструктор 'TCar', как это:' общественного TCAR (Car автомобиль) 'и назначить соответствующие поля соответствующим образом. –

ответ

5

Вашего код не будет работать, потому что Car не TCar. Другой способ работы: car = datcar.

Однако это, вероятно, не делать то, что вы ожидаете, как это будет только сделать два ссылкиcar и datcar указывают на тот же объект TCar.

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

3

Вы можете создать новый объект со свойствами другого:

Car car = new Car("jeep"); 

TCar datCar = new Tcar { 
Brand = car.Brand 
}; 

Или вы можете создать явные/неявные операторов или использовать инструмент отображения, как AutoMapper.

4

datacar является Car, но это конкретно TCar поэтому ссылка на car не может быть установлен, потому что они не имеют одного и того же типа в памяти. Кроме того, то, что вы делаете, не будет устанавливать значения свойств, оно просто установит ссылку (или указатель) в памяти.

Что вы ищете, это Clone для другого типа. Рассмотрите возможность добавления методы расширения для клонирования, что объект:

namespace System 
{ 
    public static class Extensions 
    { 
     public static TOut Clone<TOut>(this Car input) where TOut : Car 
     { 
      var o = Activator.CreateInstance(typeof(TOut)); 
      foreach (var prop in typeof(Car).GetProperties()) 
      { 
       prop.SetValue(o, prop.GetValue(input)); 
      } 
     } 
    } 
} 

и теперь вы можете сделать это:

TCar datacar = car.Clone<TCar>(); 
+0

Я действительно не хочу добавлять функции, потому что я использую свои классы как модели в веб-проекте .net mvc4, но это хорошее решение проблемы, спасибо, я буду иметь в виду это. – appl3r

0

В C# вам нужно операторы преобразования - и, в случае, если вы упомянули, было бы неявной преобразования.

Цитируя MSDN:. «C# позволяет программистам объявлять преобразования на классах или структуры, так что классов или Структуры могут быть преобразованы в и/или из других классов или структур или основных типов Конверсия определяется как операторы и именованный для типа, к которому они конвертируются. Либо тип преобразуемого аргумента, либо тип результата преобразования, но не оба, должны быть типом-содержащим ».

Это будет выглядеть примерно так:

class Car 
{ 
    // ...other members 

    // User-defined conversion from TCar to Car 
    public static implicit operator Car(TCar d) 
    { 
     return new Car(d); 
    } 
    // User-defined conversion from Car to TCar 
    public static implicit operator TCar(Car d) 
    { 
     return new TCar(d); 
    } 
} 

Источник: http://msdn.microsoft.com/en-us/library/09479473(v=vs.90).aspx

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