Domanda Copia i valori delle proprietà su un altro oggetto con C # [duplicato]


Questa domanda ha già una risposta qui:

Per copiare i valori delle proprietà da un oggetto a un altro, di solito otteniamo con la seguente sintassi:

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

dove ca e cb sono della stessa classe.

C'è qualche sintassi più semplice o metodo di utilità aiutarci a ottenere lo stesso effetto?

Grazie.


13
2017-08-10 03:16


origine


risposte:


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

    }

}

19
2018-03-02 16:21



Questa è una funzione che ho usato per copiare membri tra i modelli in ASP.NET MVC. Mentre cerchi un codice che funzioni per lo stesso tipo, questo codice supporterà anche altri tipi che hanno le stesse proprietà.

Usa i riflessi, ma in modo più pulito. Attenti al Convert.ChangeType: potresti non averne bisogno; potresti fare un controllo sul tipo invece di convertirlo.

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

Poiché si tratta di un metodo di estensione, l'utilizzo è semplice:

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

10
2017-08-10 03:36



Se non mi sbaglio con ciò che è richiesto, il modo per ottenere facilmente copia del valore della proprietà tra due istanze esistenti (anche non dello stesso tipo) è da usare automapper.

  1. creare la configurazione della mappatura
  2. e poi chiama .Map (soure, target)

Finché si mantiene la proprietà nello stesso tipo e nella stessa convenzione di denominazione, tutto dovrebbe funzionare.

Esempio:

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

5
2018-02-03 09:37



non proprio. c'è un MemberwiseClone () ma che copia i riferimenti direttamente significa che otterresti un riferimento allo stesso oggetto e che può essere cattivo. È possibile implementare il ICloneable interfaccia e usalo per una copia profonda. Preferisco creare il mio metodo Clone () perché l'interfaccia ICloneable restituisce un oggetto che deve essere lanciato.


3
2017-08-10 03:19



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

utilizzo:

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

1
2018-04-30 04:20