怎样通过反射将两个相同类型,一个对象的属性完全赋值给另一个对象

dangdang2471 2019-07-04 03:33:30
    static class ExtTest
{
public static void Copy(this object obj, object source)
{
// 如何通过反射实现?
}
}

class MyClass
{
public string Name { get; set; }
public int Num { get; set; }
public List<int> Params { get; set; }
public MyClass Test { get; set; }
}

class Program
{
static void Main(string[] args)
{
var a = new MyClass();
a.Name = "xxx";
a.Num = 10;
a.Params = new List<int>();
a.Params.Add(100);
a.Params.Add(100);
a.Params.Add(200);
a.Test = a;

var b = new MyClass();
b.Copy(a);

Console.ReadKey();
}
}
...全文
750 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
爱生活爱敏敏 2019-07-04
  • 打赏
  • 举报
回复
引用 2 楼 正怒月神的回复:
automapper
可以放射拿值让后写到另外一个对象,二楼哈士奇老哥说了automapper也是一种方法挺不错的
stherix 2019-07-04
  • 打赏
  • 举报
回复

public delegate TOut Clone(TIn data);
public static Clone GetCloneDelegate<TIn, TOut>()
{
    var method = new DynamicMethod("", typeof(TOut), new[] { typeof(TIn) }, true);
    var il = method.GetILGenerator();
    var VarOut = il.DeclareLocal(typeof(TOut));
    il.Emit(OpCodes.Newobj, typeof(TOut).GetConstructor(new Type[] { }));
    il.Emit(OpCodes.Stloc, VarOut);
    foreach (var item in typeof(TOut).GetProperties())
    {
        if (!item.CanWrite)
            continue;
        var pinfo = typeof(TIn).GetProperty(item.Name);
        if (pinfo == null) continue;
        il.Emit(OpCodes.Ldloc, VarOut);
        il.Emit(OpCodes.Ldarg_0);
        il.Emit(OpCodes.Callvirt, pinfo.GetGetMethod());
        il.Emit(OpCodes.Callvirt, item.GetSetMethod());
    }
    il.Emit(OpCodes.Ldloc, VarOut);
    il.Emit(OpCodes.Ret);
    return method.CreateDelegate(typeof(Clone)) as Clone;
}
wanghui0380 2019-07-04
  • 打赏
  • 举报
回复
Emitmap 你值得拥有 ps:automap也行,实际上automap默认就是反射实现的。而emitmap采用的是emit方式,在实现上比反射稍微强点 https://cloud.tencent.com/developer/article/1344626
bloodish 2019-07-04
  • 打赏
  • 举报
回复
额,你要扩展方法,再加一点可读可写的判断

 public static void CopyProps<T>(this T src, T dst)
        {
            foreach (var prop in typeof(T).GetProperties())
            {
                if(prop.CanRead && prop.CanWrite)
                {
                    prop.SetValue(dst, prop.GetValue(src));
                }
            }
        }
正怒月神 2019-07-04
  • 打赏
  • 举报
回复
automapper
bloodish 2019-07-04
  • 打赏
  • 举报
回复

public static void AssignProps<T>(T src, T dst)
{
          foreach(var prop in typeof(T).GetProperties())
          {
                prop.SetValue(dst, prop.GetValue(src));
          }
}

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧