Подтвердить что ты не робот

Скопируйте значения свойств на другой объект с помощью С#

Чтобы скопировать значения свойств из одного объекта в другой, мы обычно достигаем следующим синтаксисом:

ca.pro1 = cb.pro2;
ca.pro2 = cb.pro2;

где ca и cb относятся к одному классу.

Есть ли более простой метод synatx или utility, чтобы помочь нам достичь такого же эффекта?

Спасибо.

4b9b3361

Ответ 1

public static void CopyPropertiesTo<T, TU>(this T source, TU dest)
{
    var sourceProps = typeof (T).GetProperties().Where(x => x.CanRead).ToList();
    var destProps = typeof(TU).GetProperties()
            .Where(x => x.CanWrite)
            .ToList();

    foreach (var sourceProp in sourceProps)
    {
        if (destProps.Any(x => x.Name == sourceProp.Name))
        {
            var p = destProps.First(x => x.Name == sourceProp.Name);
            if(p.CanWrite) { // check if the property can be set or no.
                p.SetValue(dest, sourceProp.GetValue(source, null), null);
            }
        }

    }

}

Ответ 2

Это функция, которую я использовал для копирования элементов между моделями в ASP.NET MVC. В то время как вы ищете код, который работает для того же типа, этот код также будет поддерживать другие типы, которые имеют те же свойства.

Он использует отражения, но более чистым образом. Остерегайтесь Convert.ChangeType: вам может и не понадобиться; вы можете выполнить проверку типа вместо преобразования.

public static TConvert ConvertTo<TConvert>(this object entity) where TConvert : new()
{
    var convertProperties = TypeDescriptor.GetProperties(typeof(TConvert)).Cast<PropertyDescriptor>();
    var entityProperties = TypeDescriptor.GetProperties(entity).Cast<PropertyDescriptor>();

    var convert = new TConvert();

    foreach (var entityProperty in entityProperties)
    {
        var property = entityProperty;
        var convertProperty = convertProperties.FirstOrDefault(prop => prop.Name == property.Name);
        if (convertProperty != null)
        {
            convertProperty.SetValue(convert, Convert.ChangeType(entityProperty.GetValue(entity), convertProperty.PropertyType));
        }
    }

    return convert;
}

Поскольку это метод расширения, использование просто:

var result = original.ConvertTo<SomeOtherType>();

Ответ 3

на самом деле. существует MemberwiseClone(), но копирует ссылки, что означает, что вы получите ссылку на тот же объект, и это может быть плохо. Вы можете реализовать интерфейс ICloneable и использовать его для глубокой копии. Я предпочитаю использовать свой собственный метод Clone(), хотя интерфейс ICloneable возвращает объект, который необходимо выполнить.

Ответ 4

Если я не ошибаюсь в том, что требуется, способ легко достичь копирования значения свойства между двумя существующими экземплярами (даже не того же типа) заключается в использовании Automapper.

  • создать конфигурацию отображения
  • а затем вызовите .Map(soure, target)

Пока вы сохраняете свойство в том же типе и в одном и том же соглашении об именах, все должно работать.

Пример:

MapperConfiguration _configuration = new MapperConfiguration(cnf =>
            {
                cnf.CreateMap<SourceType, TargetType>();
            });
var mapper = new Mapper(_configuration);
maper.DefaultContext.Mapper.Map(source, target)

Ответ 5

   public static TTarget Convert<TSource, TTarget>(TSource sourceItem)
        {
            if (null == sourceItem)
            {
                return default(TTarget);
            }

            var deserializeSettings = new JsonSerializerSettings { ObjectCreationHandling = ObjectCreationHandling.Replace,  };

            var serializedObject = JsonConvert.SerializeObject(sourceItem, deserializeSettings);

            return JsonConvert.DeserializeObject<TTarget>(serializedObject);
        }

использование:

  promosion = YourClass.Convert<Promosion, PromosionExtension>(existsPromosion);