栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何快速检查两个数据传输对象在C#中是否具有相同的属性?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何快速检查两个数据传输对象在C#中是否具有相同的属性?

进行一些反思,也许是

expression.Compile()
为了表现?(请注意,这里的静态ctor确保我们每次仅编译一次
T
):

using System;using System.Linq.expressions;public class Report {    public int Id { get; set; }    public int ProjectId { get; set; }    static void Main() {        Report a = new Report { Id = 1, ProjectId = 13 }, b = new Report { Id = 1, ProjectId = 13 }, c = new Report { Id = 1, ProjectId = 12 };        Console.WriteLine(PropertyCompare.Equal(a, b));        Console.WriteLine(PropertyCompare.Equal(a, c));    }}static class PropertyCompare {    public static bool Equal<T>(T x, T y) {        return Cache<T>.Compare(x, y);    }    static class Cache<T> {        internal static readonly Func<T, T, bool> Compare;        static Cache() { var props = typeof(T).GetProperties(); if (props.Length == 0) {     Compare = delegate { return true; };     return; } var x = expression.Parameter(typeof(T), "x"); var y = expression.Parameter(typeof(T), "y"); expression body = null; for (int i = 0; i < props.Length; i++) {     var propEqual = expression.Equal(         expression.Property(x, props[i]),         expression.Property(y, props[i]));     if (body == null) {         body = propEqual;     } else {         body = expression.AndAlso(body, propEqual);     } } Compare = expression.Lambda<Func<T, T, bool>>(body, x, y)    .Compile();        }    }}

编辑:更新为也处理字段:

static class MemberCompare{    public static bool Equal<T>(T x, T y)    {        return Cache<T>.Compare(x, y);    }    static class Cache<T>    {        internal static readonly Func<T, T, bool> Compare;        static Cache()        { var members = typeof(T).GetProperties(     BindingFlags.Instance | BindingFlags.Public)     .Cast<MemberInfo>().Concat(typeof(T).GetFields(     BindingFlags.Instance | BindingFlags.Public)     .Cast<MemberInfo>()); var x = expression.Parameter(typeof(T), "x"); var y = expression.Parameter(typeof(T), "y"); expression body = null; foreach(var member in members) {     expression memberEqual;     switch (member.MemberType)     {         case MemberTypes.Field:  memberEqual = expression.Equal(      expression.Field(x, (FieldInfo)member),      expression.Field(y, (FieldInfo)member));  break;         case MemberTypes.Property:  memberEqual = expression.Equal(      expression.Property(x, (PropertyInfo)member),      expression.Property(y, (PropertyInfo)member));  break;         default:  throw new NotSupportedException(      member.MemberType.ToString());     }     if (body == null)     {         body = memberEqual;     }     else     {         body = expression.AndAlso(body, memberEqual);     } } if (body == null) {     Compare = delegate { return true; }; } else {     Compare = expression.Lambda<Func<T, T, bool>>(body, x, y)        .Compile(); }        }    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/575998.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号