Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 219059
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 11, 20262026-05-11T18:48:34+00:00 2026-05-11T18:48:34+00:00

Given 2 objects A and B of type T, I want to assign the

  • 0

Given 2 objects A and B of type T, I want to assign the properties’ values in A to the same properties in B without doing an explicit assignment for each property.

I want to save code like this:

b.Nombre = a.Nombre;
b.Descripcion = a.Descripcion;
b.Imagen = a.Imagen;
b.Activo = a.Activo;

doing something like

a.ApplyProperties(b);

Is it possible?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-11T18:48:34+00:00Added an answer on May 11, 2026 at 6:48 pm

    I have a type in MiscUtil called PropertyCopy which does something similar – although it creates a new instance of the target type and copies the properties into that.

    It doesn’t require the types to be the same – it just copies all the readable properties from the “source” type to the “target” type. Of course if the types are the same, that’s more likely to work 🙂 It’s a shallow copy, btw.

    In the code block at the bottom of this answer, I’ve extended the capabilities of the class. To copy from one instance to another, it uses simple PropertyInfo values at execution time – this is slower than using an expression tree, but the alternative would be to write a dynamic method, which I’m not too hot on. If performance is absolutely critical for you, let me know and I’ll see what I can do. To use the method, write something like:

    MyType instance1 = new MyType();
    // Do stuff
    MyType instance2 = new MyType();
    // Do stuff
    
    PropertyCopy.Copy(instance1, instance2);
    

    (where Copy is a generic method called using type inference).

    I’m not really ready to do a full MiscUtil release, but here’s the updated code, including comments. I’m not going to rewrap them for the SO editor – just copy the whole chunk.

    (I’d also probably redesign the API a bit in terms of naming if I were starting from scratch, but I don’t want to break existing users…)

    #if DOTNET35
    using System;
    using System.Collections.Generic;
    using System.Linq.Expressions;
    using System.Reflection;
    
    namespace MiscUtil.Reflection
    {
        /// <summary>
        /// Non-generic class allowing properties to be copied from one instance
        /// to another existing instance of a potentially different type.
        /// </summary>
        public static class PropertyCopy
        {
            /// <summary>
            /// Copies all public, readable properties from the source object to the
            /// target. The target type does not have to have a parameterless constructor,
            /// as no new instance needs to be created.
            /// </summary>
            /// <remarks>Only the properties of the source and target types themselves
            /// are taken into account, regardless of the actual types of the arguments.</remarks>
            /// <typeparam name="TSource">Type of the source</typeparam>
            /// <typeparam name="TTarget">Type of the target</typeparam>
            /// <param name="source">Source to copy properties from</param>
            /// <param name="target">Target to copy properties to</param>
            public static void Copy<TSource, TTarget>(TSource source, TTarget target)
                where TSource : class
                where TTarget : class
            {
                PropertyCopier<TSource, TTarget>.Copy(source, target);
            }
        }
    
        /// <summary>
        /// Generic class which copies to its target type from a source
        /// type specified in the Copy method. The types are specified
        /// separately to take advantage of type inference on generic
        /// method arguments.
        /// </summary>
        public static class PropertyCopy<TTarget> where TTarget : class, new()
        {
            /// <summary>
            /// Copies all readable properties from the source to a new instance
            /// of TTarget.
            /// </summary>
            public static TTarget CopyFrom<TSource>(TSource source) where TSource : class
            {
                return PropertyCopier<TSource, TTarget>.Copy(source);
            }
        }
    
        /// <summary>
        /// Static class to efficiently store the compiled delegate which can
        /// do the copying. We need a bit of work to ensure that exceptions are
        /// appropriately propagated, as the exception is generated at type initialization
        /// time, but we wish it to be thrown as an ArgumentException.
        /// Note that this type we do not have a constructor constraint on TTarget, because
        /// we only use the constructor when we use the form which creates a new instance.
        /// </summary>
        internal static class PropertyCopier<TSource, TTarget>
        {
            /// <summary>
            /// Delegate to create a new instance of the target type given an instance of the
            /// source type. This is a single delegate from an expression tree.
            /// </summary>
            private static readonly Func<TSource, TTarget> creator;
    
            /// <summary>
            /// List of properties to grab values from. The corresponding targetProperties 
            /// list contains the same properties in the target type. Unfortunately we can't
            /// use expression trees to do this, because we basically need a sequence of statements.
            /// We could build a DynamicMethod, but that's significantly more work :) Please mail
            /// me if you really need this...
            /// </summary>
            private static readonly List<PropertyInfo> sourceProperties = new List<PropertyInfo>();
            private static readonly List<PropertyInfo> targetProperties = new List<PropertyInfo>();
            private static readonly Exception initializationException;
    
            internal static TTarget Copy(TSource source)
            {
                if (initializationException != null)
                {
                    throw initializationException;
                }
                if (source == null)
                {
                    throw new ArgumentNullException("source");
                }
                return creator(source);
            }
    
            internal static void Copy(TSource source, TTarget target)
            {
                if (initializationException != null)
                {
                    throw initializationException;
                }
                if (source == null)
                {
                    throw new ArgumentNullException("source");
                }
                for (int i = 0; i < sourceProperties.Count; i++)
                {
                    targetProperties[i].SetValue(target, sourceProperties[i].GetValue(source, null), null);
                }
    
            }
    
            static PropertyCopier()
            {
                try
                {
                    creator = BuildCreator();
                    initializationException = null;
                }
                catch (Exception e)
                {
                    creator = null;
                    initializationException = e;
                }
            }
    
            private static Func<TSource, TTarget> BuildCreator()
            {
                ParameterExpression sourceParameter = Expression.Parameter(typeof(TSource), "source");
                var bindings = new List<MemberBinding>();
                foreach (PropertyInfo sourceProperty in typeof(TSource).GetProperties(BindingFlags.Public | BindingFlags.Instance))
                {
                    if (!sourceProperty.CanRead)
                    {
                        continue;
                    }
                    PropertyInfo targetProperty = typeof(TTarget).GetProperty(sourceProperty.Name);
                    if (targetProperty == null)
                    {
                        throw new ArgumentException("Property " + sourceProperty.Name + " is not present and accessible in " + typeof(TTarget).FullName);
                    }
                    if (!targetProperty.CanWrite)
                    {
                        throw new ArgumentException("Property " + sourceProperty.Name + " is not writable in " + typeof(TTarget).FullName);
                    }
                    if ((targetProperty.GetSetMethod().Attributes & MethodAttributes.Static) != 0)
                    {
                        throw new ArgumentException("Property " + sourceProperty.Name + " is static in " + typeof(TTarget).FullName);
                    }
                    if (!targetProperty.PropertyType.IsAssignableFrom(sourceProperty.PropertyType))
                    {
                        throw new ArgumentException("Property " + sourceProperty.Name + " has an incompatible type in " + typeof(TTarget).FullName);
                    }
                    bindings.Add(Expression.Bind(targetProperty, Expression.Property(sourceParameter, sourceProperty)));
                    sourceProperties.Add(sourceProperty);
                    targetProperties.Add(targetProperty);
                }
                Expression initializer = Expression.MemberInit(Expression.New(typeof(TTarget)), bindings);
                return Expression.Lambda<Func<TSource, TTarget>>(initializer, sourceParameter).Compile();
            }
        }
    }
    #endif
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I want to retrieve all objects (not DOM elements) of a given type created
I have two complex objects of the same type. I want to compare both
Given two Lists, each list holding the same object type, I would like to
Basically I want to be able to have each node of type tree have
Given: Object innerProxy = ... Object proxy = java.lang.reflect.Proxy. newProxyInstance(Thread.currentThread().getContextClassLoader(), new Class[]{type}, innerProxy); How
I've got a System.Generic.Collections.List(Of MyCustomClass) type object. Given integer varaibles pagesize and pagenumber, how
How do I check if an object is of a given type, or if
Given two Date() objects, where one is less than the other, how do I
I have to select an <a> element from the given class of objects. when
Given an array of objects stored in $my_array , I'd like to extract the

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.