惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
Microsoft Security Blog
Microsoft Security Blog
Recent Announcements
Recent Announcements
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Last Week in AI
Last Week in AI
罗磊的独立博客
腾讯CDC
云风的 BLOG
云风的 BLOG
月光博客
月光博客
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
宝玉的分享
宝玉的分享
U
Unit 42
I
InfoQ
D
DataBreaches.Net
Blog — PlanetScale
Blog — PlanetScale
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
V
V2EX
美团技术团队
IT之家
IT之家
Stack Overflow Blog
Stack Overflow Blog
F
Fortinet All Blogs
GbyAI
GbyAI
S
SegmentFault 最新的问题

博客园 - 饭

This MySqlConnection is already in use. See https://fl.vu/mysql-conn-reuse WinForm使用Python.Net调用Yolov8将图像显示在pictureBox控件上. EPPlus操作透视表过滤数据 JS/html5 文字转语音 关于IIS部署.NET7的记录 nginx伪静态过滤静态文件 阿里云Nginx伪静态 记录一些壁纸/图片网站 js四舍五入. javascript四舍五入 真正四舍五入 不是四舍六入五成双 entity framework 实现按照距离排序[转] 正padding负margin实现多列等高布局(转) 在iframe内页触发顶层页面body的blur事件 bootstrap 模态窗口 多重/多个弹窗滚动条补丁 2019年6月车型数据Access数据库+缩略图 更新于2019年6月5日. sql server 2012 分页/dapper/C#拼sql/免储存过程/简易 正则: 匹配除了某些单词之外的其他单词 按顺序动态加载js, 可控版本, 有回调 asp.net mvc json数据缓存 知识点关键词(记录一下) TimeSpan格式化字符串格式(摘)
比较两个相同类型的实例是否相同, 支持忽略指定字段.
· 2020-03-08 · via 博客园 - 饭
//翠花, 上代码

var user1 = new User();
user1.Id = 1;
user1.Name = "翠花";
user1.Age = 18;

var user2 = new User();
user2.Id = 2;
user2.Name = "二狗";
user2.Age = 19;

//用法1
var isEq1 = ObjectUtil.Compare(user1, user2, x=> x.Id);

//用法2
var isEq2 = ObjectUtil.Compare(user1, user2, x=> new{ x.Id, x.Age });
public static class ObjectUtil
{
    /// <summary>
    /// 比较两个同类型的实例是否相同,
    /// </summary>
    /// <typeparam name="TEntity"></typeparam>
    /// <param name="t1"></param>
    /// <param name="t2"></param>
    /// <param name="ignore">忽略不比较的字段, 可以传入单个字段, 也可以传入匿名类 x=>{ x.Id } </param>
    /// <returns></returns>
    public static bool Compare<TEntity>(TEntity t1, TEntity t2, Expression<Func<TEntity, object>> ignore)
    {
        /*
         * 优化方向: 缓存通过反射取得的属性.
         */

        //取所有属性, 只取有{get;set;}的属性哦.
        var properties = (typeof(TEntity)).GetProperties();

        //拆解传入的表达式
        var ignoreProperty = Extract(ignore);

        //判断忽略模式, 是单字段还是多字段. 下面判断会不一样
        var isManyIgnore = ignoreProperty.Contains(",");
        if (isManyIgnore)
        {
            //加个逗号做边界,增加比较精准度.
            ignoreProperty = $",{ignoreProperty},";
        }

        foreach (var property in properties)
        {
            var pName = property.Name;
            if (isManyIgnore && ignoreProperty.Contains($",{pName},"))
            {
                continue;
            }
            else
            {
                if (ignoreProperty == pName)
                {
                    continue;
                }
            }

            var v1 = GetPropertyValue(t1, property);
            var v2 = GetPropertyValue(t2, property);

            //只要有一对字段不相等. 就结束循环. 后面的不用比了.
            if (!v1.Equals(v2))
            {
                return false;
            }
        }

        return true;
    }

    #region 私有方法
    /*
     * 拆解表达式代码来自github项目52Chloe
     * 改造增加拆解匿名类表达式功能.
     * https://github.com/shuxinqin/Chloe/blob/481fcfd7ce260f7a31b0adde07311c5b25219829/src/Chloe/Entity/PropertyNameExtractor.cs
     */
    private static string Extract(Expression exp)
    {
        return Visit(exp);
    }
    private static string Visit(Expression exp)
    {
        switch (exp.NodeType)
        {
            case ExpressionType.Lambda:
                return VisitLambda((LambdaExpression)exp);
            case ExpressionType.MemberAccess:
                return VisitMemberAccess((MemberExpression)exp);
            case ExpressionType.Convert:
                return VisitUnary_Convert((UnaryExpression)exp);
            case ExpressionType.New:
                return VisitProperties(exp);
            default:
                throw new Exception(string.Format("Unhandled expression type: '{0}'", exp.NodeType));
        }
    }
    private static string VisitLambda(LambdaExpression exp)
    {
        return Visit(exp.Body);
    }
    private static string VisitMemberAccess(MemberExpression exp)
    {
        return exp.Member.Name;
    }
    private static string VisitUnary_Convert(UnaryExpression exp)
    {
        return Visit(exp.Operand);
    }
    private static string VisitProperties(object exp)
    {
        var members = ((NewExpression)exp).Members;

        if (members == null || members.Count == 0)
        {
            return string.Empty;
        }

        return string.Join(",", members.Select(p => p.Name).ToArray());
    }
    private static object GetPropertyValue<T>(T t, PropertyInfo property)
    {
        return property.GetValue(t);
    }

    #endregion
}

来都来了, 点个赞再走呗.↓