110,535
社区成员
发帖
与我相关
我的任务
分享
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();
}
}
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;
}
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));
}
}
}
public static void AssignProps<T>(T src, T dst)
{
foreach(var prop in typeof(T).GetProperties())
{
prop.SetValue(dst, prop.GetValue(src));
}
}