2

たとえば、私はこのクラスを持っています

class Person{
    private int _id = int.MinValue;
    private string _name = string.Empty;
    private int _age = int.MinValue;
    private string _city = string.Empty;

    public string Id{ get { return _id ; } set { _id = value; } }
    public string Name{ get { return _name; } set { _name = value; } }
    public int Age{ get { return _age; } set { _age = value; } }
    public string City{ get { return _city ; } set { _name = city; } }
}

そして、私がテーブルに表示する Person のリスト。このテーブルには「編集/インライン」があります。一部の人のプロパティにはテーブル内のセル(td)があるため、javascript/jquery を介してセルを編集すると、変更された値で json オブジェクトが作成され、サーバーに送信します。json オブジェクトには、変更されたプロパティのみが含まれます。「名前」を編集すると、json オブジェクトは次のようになります。

{"obj":{"Id":"1","Name":"Anna"}}

しかし、サーバーへのオブジェクト Person は次のようになります

Id = 1, Name = "Anna", Age = 0, City = null

したがって、問題は次のとおりです。更新ストアド プロシージャを実行するには、変更されたプロパティの例外に対するすべての元の値を持つオブジェクトを作成する必要があります。この例では、次のオブジェクトを取得します。

Id = 1, Name = "Anna", Age = 25, City = "New York"

このオブジェクトを作成するには、このメソッドを使用します

public static TEntity CopyTo<TEntity>(this TEntity OriginalEntity, TEntity NewEntity){
    PropertyInfo[] oProperties = OriginalEntity.GetType().GetProperties();
    foreach (PropertyInfo CurrentProperty in oProperties.Where(p => p.CanWrite))
    {
         if (CurrentProperty.GetValue(OriginalEntity, null) == null)
         {
             CurrentProperty.SetValue(OriginalEntity, CurrentProperty.GetValue(NewEntity, null), null);
         }
    }

        return OriginalEntity;
}

新しいオブジェクトに値Personを持つプロパティがあるnull場合、元の値から元の値を取得しますPerson( NewEntity)。クライアントからサーバーへのAgeプロパティは ではなく になるため、この方法は数値では機能しませ0null

この問題を解決するにはどうすればよいですか? 私が使用できないと考えるには:

  • プロジェクト全体で非常に多くのコード行を変更する必要があるため、null 許容型。
  • テーブルには Person のすべてのプロパティが含まれていない可能性があるため、JavaScript でオブジェクト全体を作成してから、変更された値のみを変更することはできません。

私は私の悪い英語で十分に明確だったと思います

4

1 に答える 1

0

k; 言い換えると、null 以外の値を持つすべてのプロパティを既存のオブジェクトにコピーする必要があります。さて、最初の問題 (お気づきのとおり) は、 is を持つことができないというintことですnullAge幸いなことに、とIdNullable<int>別名を作成するという実用的な手順を実行するだけで、これを修正できますint?

class Person
{
    public int? Id { get; set; }
    public string Name { get; set; }
    public int? Age { get; set; }
    public string City { get; set; }
}

これで、「null 以外の値をすべてコピーする」だけになりました。そのためには、この既存の回答を見てください。これは、リフレクション アプローチに少し似ていますが、IL を使用して非常に高速です。

使用例:

var orig = new Person {Id = 1, Name = "Anna"};
var delta = new Person {Id = 1, Age = 25, City = "New York"};

var merged = Merger.Merge(orig, delta);
Console.WriteLine(merged.Id);
Console.WriteLine(merged.Age);
Console.WriteLine(merged.Name);
Console.WriteLine(merged.City);

既存のオブジェクトの 1 つに対してインプレース マージを行うように調整することもできます。

于 2012-09-14T09:33:23.000 に答える