1

2 つのクラス間でデータをマッピングしています。1 つのクラスは、別のクラス (販売注文) でデータを作成または修正する発注書です。また、販売注文値が null でない場合の変更内容のトランザクション ログも保持しています。これをジェネリックにする方法をアドバイスできますか?

private static DateTime CheckForChange(this DateTime currentValue, 
    DateTime newValue, string propertyName)
{
    if (currentValue == newValue) return currentValue;
    LogTransaction(propertyName);
    return newValue;
}
private static decimal CheckForChange(this decimal currentValue, 
    decimal newValue, string propertyName)
{
    if (currentValue == newValue) return currentValue;
    LogTransaction(propertyName);
    return newValue;
}
private static int CheckForChange(this int currentValue, 
    int newValue, string propertyName)
{
    if (currentValue == newValue) return currentValue;
    LogTransaction(propertyName);
    return newValue;
}

元の提案されたコード例

private static T CheckForChange<T>(this T currentValue, T newValue, 
    string propertyName) where T : ???
{
    if (currentValue == newValue) return currentValue;
    LogTransaction(propertyName);
    return newValue;
}

最終リビジョン:

    public static T CheckForChange<T>(this T currentValue, T newValue, 
        string propertyName, CustomerOrderLine customerOrderLine)
    {
        if (object.Equals(currentValue, newValue)) return currentValue;
        //Since I am only logging the revisions the following line excludes Inserts
        if (object.Equals(currentValue, default(T))) return newValue;
        //Record Updates in Transaction Log
        LogTransaction(customerOrderLine.CustOrderId, 
                       customerOrderLine.LineNo, 
                       propertyName, 
                       string.Format("{0} was changed to {1}",currentValue, newValue)
                       );
        return newValue;
    }
4

1 に答える 1

5

あなたは非常に近いです:)魔法の解決策はEqualsメソッドを使用することです

public static T CheckForChange<T>(this T currentValue, T newValue, string propertyName)
{
    if (currentValue.Equals(newValue)) return currentValue;
    LogTransaction(propertyName);
    return newValue;
}

私のソリューションを強化して、null をチェックできます。

public static T CheckForChange<T>(this T currentValue, T newValue, string propertyName)
{
    bool changed = false;
    if (currentValue == null && newValue != null) changed = true;
    else if (currentValue != null && !currentValue.Equals(newValue)) changed = true;
    if (changed)
    {
        LogTransaction(propertyName);
    }
    return newValue;
}

* 編集 *

object.Equalsコメントのように、次のメソッドを使用して null チェックの問題を解決できます。

public static T CheckForChange<T>(this T currentValue, T newValue, string propertyName)
{
    if (object.Equals(currentValue,newValue)) return currentValue;
    LogTransaction(propertyName);
    return newValue;
}
于 2012-12-27T16:58:08.720 に答える