CSharp-复制对象的方式

在代码中经常会遇到需要把对象复制一遍,或者把属性名相同的值复制一遍。

解决方法

以People为例

1
2
3
4
5
6
public class People
{
public string IdCard { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
  1. 手动赋值

    1
    2
    People p = new People() {IdCrad = "445221XXXXXXXX", Name="caty", Age=21 };
    People h = new People() {IdCrad = p.IdCard, Name = p.Name, Age = p.Age };
  2. 反射

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    private static TOut TransReflection<TIn, TOut>(TIn tIn)
    {
    TOut tOut = Activator.CreateInstance<TOut>();
    var tInType = tIn.GetType();
    foreach (var itemOut in tOut.GetType().GetProperties())
    {
    var itemIn = tInType.GetProperty(itemOut.Name); ;
    if (itemIn != null)
    {
    itemOut.SetValue(tOut, itemIn.GetValue(tIn));
    }
    }
    return tOut;
    }

    People pp = TransReflection<People, People>(p);
  3. 序列化
    需引入Newtonsoft. Json 包

    1
    People ss= JsonConvert.DeserializeObject<People>(JsonConvert.SerializeObject(s));
  4. 表达式树

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    public static class TransExpression<TIn, TOut>
    {
    private static readonly Func<TIn, TOut> cache = GetFunc();
    private static Func<TIn, TOut> GetFunc()
    {
    ParameterExpression parameterExpression = Expression.Parameter(typeof(TIn), "p");
    List<MemberBinding> memberBindingList = new List<MemberBinding>();
    foreach (var item in typeof(TOut).GetProperties())
    {
           if (!item.CanWrite)
             continue;
    MemberExpression property = Expression.Property(parameterExpression, typeof(TIn).GetProperty(item.Name));
    MemberBinding memberBinding = Expression.Bind(item, property);
    memberBindingList.Add(memberBinding);
    }

    MemberInitExpression memberInitExpression = Expression.MemberInit(Expression.New(typeof(TOut)), memberBindingList.ToArray());
    Expression<Func<TIn, TOut>> lambda = Expression.Lambda<Func<TIn, TOut>>(memberInitExpression, new ParameterExpression[] { parameterExpression });
    return lambda.Compile();
    }

    public static TOut Trans(TIn tIn)
    {
    return cache(tIn);
    }
    }

    People pp = TransExpression<People,People>,Trans(p);

CSharp-复制对象的方式
http://blog.chcaty.cn/2018/06/09/csharp-tong-guo-biao-da-shi-shu-fu-zhi-dui-xiang/
作者
caty
发布于
2018年6月9日
许可协议