2

C# クラスのプロパティを反復処理して、値を別のインスタンスと比較しています。コンセプトはシンプルで、私がやろうとしていることでうまくいきます。ただし、私の foreach ループは停止しません。クラスをループし続け、StackOverflowException. 私はこれで途方に暮れています。どんな助けでも大歓迎です!

public static Object ORIGINALRECORD { get; set; }

protected String DirtySets() 
{
    String sDirtySets = "";

    foreach (PropertyInfo property in this.GetType().GetProperties(BindingFlags.Public|BindingFlags.Instance))
    {
        if (ORIGINALRECORD.GetType() == this.GetType())
        {
            System.Diagnostics.Debug.WriteLine(property.Name);
            object originalValue = ORIGINALRECORD.GetType().GetProperty(property.Name).GetValue(ORIGINALRECORD, null);
            object newValue = property.GetValue(this, null);
            if (!object.Equals(originalValue, newValue))
            {
                sDirtySets = (sDirtySets == "" ? "" : sDirtySets + ",") + property.Name + "=?";
            }    
        }
    }

    return "SET "+sDirtySets;
}
4

1 に答える 1

3

ループ内には、クラスのプロパティの値を取得するステートメントがあります。

object newValue = property.GetValue(this, null);

ORIGINALRECORDオブジェクトの型がすべてのパブリック プロパティ値の型と同じでない限り、取得されます。

プロパティの 1 つの getter の 1 つが呼び出すDirtySetsと、無限再帰が発生します。コールバックするループ内でDirtySets、新しいループが開始され、StackOverflowException.

これを回避するにDirtySetsは、パブリック プロパティの getter から呼び出されないようにするか、getter で呼び出すプロパティの値を取得しないようにする必要がありますDirtySets

于 2013-07-19T13:06:50.293 に答える