
var people = new People()
{
Id = 11,
Name = "Richard",
Age = 31
};
int count = 1_000_000;
var common = HiPerfTimer.Execute(() =>
{
for (int i = 0; i < count; i++)
{
var item = new PeopleCopy()
{
Id = people.Id,
Name = people.Name,
Age = people.Age,
};
}
});
Console.WriteLine(string.Format("common={0} ms", common));
var serialize = HiPerfTimer.Execute(() =>
{
PeopleCopy item = new PeopleCopy();
for (int i = 0; i < count; i++)
{
var rslt = JsonConvert.SerializeObject(people);
item = JsonConvert.DeserializeObject<PeopleCopy>(rslt);
}
});
Console.WriteLine(string.Format("serialize={0} ms", serialize));
var generic = HiPerfTimer.Execute(() =>
{
PeopleCopy item = new PeopleCopy();
for (int i = 0; i < count; i++)
{
item = ExpressionTreeHelper<PeopleCopy>.EntityMap(people);
}
});
Console.WriteLine(string.Format("generic={0} ms", generic));
var copy = HiPerfTimer.Execute(() =>
{
PeopleCopy item = new PeopleCopy();
for (int i = 0; i < count; i++)
{
var aa = people.DeepCopy();
}
});
Console.WriteLine(string.Format("DeepCopy={0} ms", copy));
public class ExpressionTreeHelper<T>
{
public static T EntityMap<TSrc>(TSrc src)
{
return ExpressionGenericMapper<TSrc, T>.EntityMap(src);
}
}
internal class ExpressionGenericMapper<TSrc, TDst>
{
private static readonly Func<TSrc, TDst> _func = null;
static ExpressionGenericMapper()
{
var parameterExpression = Expression.Parameter(typeof(TSrc), "e");
var list = new List<MemberBinding>();
foreach (var item in typeof(TDst).GetProperties())
{
var property = Expression.Property(parameterExpression, typeof(TSrc).GetProperty(item.Name));
var binding = Expression.Bind(item, property);
list.Add(binding);
}
foreach (var item in typeof(TDst).GetFields())
{
var property = Expression.Field(parameterExpression, typeof(TSrc).GetField(item.Name));
var binding = Expression.Bind(item, property);
list.Add(binding);
}
var miExpression = Expression.MemberInit(Expression.New(typeof(TDst)), list.ToArray());
var lambda = Expression.Lambda<Func<TSrc, TDst>>(miExpression, new[]
{
parameterExpression
});
_func = lambda.Compile();
}
public static TDst EntityMap(TSrc obj)
{
return _func(obj);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库