1

次のコードは、2 つのオブジェクトを受け取り、変更された可能性のあるプロパティのリストを返します。

public static List<ConfirmRow> EnumerateFormDiffs(object dbForm, object webForm)
{
var output = new List<ConfirmRow>();
var type = dbForm.GetType();

PropertyInfo[] propertyInfos = type.GetProperties();

foreach (var property in propertyInfos)
{
    Type propertyType = property.GetType();
    if (!propertyType.IsPrimitive && !propertyType.Equals(typeof(string)) && !propertyType.Equals(typeof(DateTime)))
    {
        continue;
    }

    var oldVal = property.GetValue(dbForm, null);
    var newVal = property.GetValue(webForm, null);
    if (oldVal != null && newVal != null)
    {
        if (oldVal.ToString() != newVal.ToString())
        {
            var displayName = (ModelMetadata.FromStringExpression(property.Name, new ViewDataDictionary(dbForm)).DisplayName ?? property.Name);
            var tmp = new ConfirmRow
            {
                FieldName = displayName,
                OldValue = DisplayField(property.Name, type.Name, oldVal),
                NewValue = DisplayField(property.Name, type.Name, newVal)
            };
            output.Add(tmp);
        }
    }
    else if (oldVal == null && newVal != null)
    {
        var displayName = (ModelMetadata.FromStringExpression(property.Name, new ViewDataDictionary(dbForm)).DisplayName ?? property.Name);
        var tmp = new ConfirmRow { FieldName = displayName, OldValue = "", NewValue = DisplayField(property.Name, type.Name, newVal) };
        output.Add(tmp);
    }
    else if (newVal == null && oldVal != null)
    {
        var displayName = (ModelMetadata.FromStringExpression(property.Name, new ViewDataDictionary(dbForm)).DisplayName ?? property.Name);
        var tmp = new ConfirmRow { FieldName = displayName, OldValue = DisplayField(property.Name, type.Name, oldVal), NewValue = "" };
        output.Add(tmp);
    }
}
return output;
}

そして、私は2つの「登録」オブジェクトを比較しています:

public class Enrollment
{
    public int Id { get; set; }

    public int? ClientId { get; set; }
    [ForeignKey("ClientId")]
    public virtual Client Client { get; set; }

    public int Version { get; set; }

    .
    .
    .

    public SaveSubmitStatus? SaveSubmitStatus { get; set; }

}

SaveSubmitStatus は Enum です。

ここで、コードに「Client」フィールドを見ないように指示したいと思います。これは問題を引き起こしているためですが、「SaveSubmitStatus」フィールドがいつ変更されたかを確認したいのです。これをデバッグすると、両方のプロパティで PropertyType が「RuntimePropertyInfo」になります。「SaveSubmitStatus」フィールドの違いを確認する方法を特定して if ステートメントに含める方法を誰か教えてもらえますか? これを判断できるように、デバッグ時にオブジェクト内に何も見つかりません。

4

2 に答える 2