首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >代表反思

代表反思
EN

Stack Overflow用户
提问于 2022-07-07 11:55:13
回答 1查看 78关注 0票数 0

我使用反射来比较两个对象列表(相同类型),并收集具有不同值的属性列表。我可能会迭代很多对象列表来比较以性能滞后结束的对象列表。我开始了解如何在反射中使用委托,这样我们就可以绕过需要时间的.GetValue(obj, null)了。我的类属性的类型很广。它可以是字符串、int和enum。对我来说,可用的解决方案是行不通的。谢谢你的帮助。

我用来比较两个相同类型的对象的代码

代码语言:javascript
复制
public List<string> Compare<T>(object A, object B)
{
                var type = typeof(T);
                var allProperties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);

                List<string> unequalProperties =
                    (
                        from pi in allProperties 
                        let AValue = type.GetProperty(pi.Name).GetValue(A, null)
                        let BValue = type.GetProperty(pi.Name).GetValue(B, null)
                        where AValue != BValue && (AValue == null || !AValue.Equals(BValue))
                        select pi.Name
                    ).ToList();
                return unequalProperties;
}

这两个.GetValue(A/B, null)正在产生滞后,我希望使用委托跳过这个滞后。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-07 14:41:40

通过将代码放入泛型类中,可以将getter委托缓存在静态字段中。

然后,您可以使用更多的泛型使用两级类层次结构来缓存属性本身。

代码语言:javascript
复制
public List<string> Compare<T>(T A, T B)
{
    return GenericComparer<T>.Compare(A, B);
}

abstract class PropertyCompareBase<T>
{
    public string Name;
    public abstract bool CompareProperty(T A, T B);
}

class PropertyCompare<T, TProperty> : PropertyCompareBase<T>
{
    Func<T, TProperty> Getter;

    public PropertyCompare(PropertyInfo prop)
    {
        Name = prop.Name;
        Getter = (Func<T, TProperty>)prop.GetMethod.CreateDelegate(typeof(Func<T, TProperty>));
    }

    public override bool CompareProperty(T A, T B)
    {
        return EqualityComparer<TProperty>.Default.Equals(Getter(A), Getter(B));
    }
}

static class GenericComparer<T>
{
    static List<PropertyCompareBase<T>> properties = typeof(T)
        .GetProperties(BindingFlags.Public | BindingFlags.Instance)
        .Where(p => p.GetIndexParameters().Length == 0)
        .Select(p => (PropertyCompareBase<T>)Activator.CreateInstance(
                         typeof(PropertyCompare<,>)
                         .MakeGenericType(typeof(T), p.PropertyType),
                        p))
        .ToList();

    static public List<string> Compare(T A, T B)
    {
        List<string> unequalProperties =
            properties.Where(p => !p.CompareProperty(A, B))
                      .Select(p => p.Name)
                      .ToList();
        return unequalProperties;
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72897394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档