0

誰かがこれにリフレクションを使用することを提案しました。私が持っている方法はうまく機能しますが、800,000回以上の反復で、リフレクションはそれをカットしないという明らかな結論に達しました(ほとんどがすでに到達しています)。

これが私のヘルパークラスの一部です:

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 個のプロパティをチェックできることです。だから、私はそこでたくさんのことをすることはできませんif

これを少しスピードアップする方法はありますか?

ありがとう。

4

3 に答える 3

2

Reflection.Emitを使用して比較メソッドを動的に作成し、単純に実行することができます。コードは JIT され、かなり迅速に実行されます。

欠点が 1 つあります。IL がどのように機能するかを知っておく必要があります。

于 2012-11-29T17:29:14.617 に答える
1

これを少しスピードアップする方法はありますか?

絶対。異なるオブジェクトに対して同じプロパティを複数回フェッチする場合は、プロパティごとにデリゲートを作成するか (いくつかの例については、私が少し前に書いたこのブログ投稿を参照してください)、 Hyperdescriptorのようなプロジェクトを使用します。

(.NET 3.5 の時点で、デリゲートを作成する別の方法は、式ツリーを使用してコンパイルすることです。)

于 2012-11-29T17:30:30.500 に答える
0

比較するプロパティを指定するを作成できます。その後、それをラムダ式としてコンパイルし、それを使用して項目をデリゲート呼び出しのパフォーマンスと比較できます。

于 2012-11-29T17:31:15.080 に答える