2014-02-21 4 views
1

Есть ли способ сравнить два экземпляра двух разных структур и, если есть свойства с одним и тем же именем, скопировать их из одного экземпляра в другой?Свойства копирования между structs

Например, возьмем две Структуры:

struct typeA 
{ 
public byte ID; 
public byte distance; 
public byte time; 
} 

struct typeB 
{ 
public byte distance; 
public byte length; 
} 

переменные затем создали

typeA A; 
typeB B; 

рядом некоторые значения присваиваются

A.ID = 101; 
A.distance = 12; 
A.time = 5; 

Теперь я хочу, чтобы сравнить переменную A с B и если есть какие-либо свойства с тем же именем (в этом случае «расстояние» существует для обеих структур t) скопировать их в другую переменную. Я не хочу использовать

B.distance = A.distance 

как я не всегда знаю имена свойств.

Есть ли у кого-нибудь идеи? Только слышали о отражении, это что-то, на что посмотреть?

+0

Пожалуйста, не включайте метку тома в заголовок, если это не имеет смысла без него. Теги служат для этой цели. –

+0

Боковое примечание. Я предлагаю вам использовать правила именования C#, особенно часть, относящуюся к [стилям капитализации] (http://msdn.microsoft.com/en-us/library/x2dbyw72 (v = vs.71) .aspx) –

ответ

3

Я предлагаю вам использовать инструмент сопоставления для этого. Например. AutoMapper (от NuGet Имеющийся)

Mapper.CreateMap<typeA, typeB>(); 
typeA A = new typeA { ID = 101, distance = 12, time = 5 }; 
typeB B = new typeB { length = 42 }; 
// ... 
B = Mapper.Map(A, B); 

С отображения по умолчанию AutoMapper будет отображать свойства, которые имеют одинаковые имена.

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

{ 
    distance: 12, 
    length: 42 
} 
0

Вы должны воспользоваться AutoMapper.

Тогда вы могли бы использовать это следующим образом:

Mapper.CreateMap<typeA, typeB>(); 

В случае, если вы хотели бы установить некоторые дополнительные правила для процесса отображения вы могли бы сделать это в follownig образом:

Mapper.CreateMap<typeA, typeB>() 
    .ForMember(dest => dest.a, opt => opt.MapFrom(src => src.b)); 
1

Пожалуйста, обратите внимание, что вы говорите о свойства, но ваш пример кода определяет поля и не свойство. В соответствии с инструкциями по расширению копий полей:

public static class Extensions 
{ 
    public static void MergeFrom<TSource, TDestination>(this TDestination dest, TSource source) 
    { 
     var fieldPairs = typeof(TDestination) 
      .GetFields() 
      .Join(
       typeof(TSource).GetFields(), 
       p => p.Name, 
       a => a.Name, 
       (bp, ap) => new { Source = bp, Destination = ap }); 
     foreach (var pair in fieldPairs) 
     { 
      pair.Destination.SetValue(dest, pair.Source.GetValue(source)); 
     } 
    } 
} 
Смежные вопросы