0

有人建议为此使用反射。我的方法效果很好,但是经过 800,000 次迭代后,我得出了一个明显的结论(大多数人已经得出),即反射并不能解决问题。

这是我的 Helper 类的一部分:

public static class Helper
{
    public static string[] ignoredProperties =
    { 
        "EntityState", 
        "EntityKey", 
        "Prop1", 
        "Prop2", 
        "Whatever", 
    };

    /// <summary>
    /// Check if properties of two objects are the same. Bypasses specified properties.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="first"></param>
    /// <param name="other"></param>
    /// <param name="ignoreProperties"></param>
    /// <returns></returns>
    public static bool PropertiesEquals<T>(this T first, T other, string[] ignoreProperties)
    {
        var propertyInfos = first.GetType().GetProperties();
        foreach (PropertyInfo propertyInfo in propertyInfos)
        {
            //Faster with custom method ? Nah...
            //if (FindElementIndex(ignoreProperties, propertyInfo.Name) < 0)

            //Probably faster if hardcoded.... Nah, not really either...
            //if (propertyInfo.Name != "EntityKey" && propertyInfo.Name != "EntityState" && propertyInfo.Name != "Group_ID" && propertyInfo.Name != "Import_status")

            if (Array.IndexOf(ignoreProperties, propertyInfo.Name) < 0)
                if (!Equals(propertyInfo.GetValue(first, null), propertyInfo.GetValue(other, null)))
                    return false;
        }
        return true;
    }

    public static int FindElementIndex(string[] input, string value)
    {
        int arraySize = input.Length - 1;
        Type valueType = value.GetType();

        for (int x = 0; x <= arraySize; x++)
        {
            if (input[x] == value)
                return x;
        }

        return -1;
    }

问题是这些对象,根据类型,最多可以检查 50 个属性。所以我真的不能在那里做一堆ifs 。

有什么办法可以加快速度吗?

谢谢。

4

3 回答 3

2

您可以使用Reflection.Emit动态创建比较方法,然后简单地运行它。代码将被 JITted 并运行得相当快。

有一个缺点 - 你必须知道 IL 是如何工作的。

于 2012-11-29T17:29:14.617 回答
1

有什么办法可以加快速度吗?

绝对地。如果您要为不同的对象多次获取相同的属性,请为每个属性创建一个委托(有关一些示例,请参阅我不久前写的这篇博文)或使用Hyperdescriptor 之类的项目。

(从 .NET 3.5 开始,另一种创建委托的方法是使用表达式树并编译它们。)

于 2012-11-29T17:30:30.500 回答
0

您可以构建一个表达式,您可以在其中指定应比较哪些属性。然后,您可以将其编译为 lambda 表达式,并使用它来比较项目与委托调用的性能。

于 2012-11-29T17:31:15.080 回答