2012-09-14 37 views
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; } } 
} 

和我顯示了在表人的名單。在這個表中有一個「in place/inline」:一些Person的屬性在表格中有一個單元格(td),所以當我通過javascript/jquery編輯一個單元格時,我創建了具有更改值的json對象,而我發送給服務器。 JSON對象僅包含屬性變化:如果我編輯「姓名」 JSON對象將是:

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

但對象者的服務器來作爲

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; 
} 

如果新的對象Personnull值的屬性,然後我把原單值從原始PersonNewEntity)。這種方式不適用於數字,因爲從客戶端到服務器Age屬性成爲0而不是null

我該如何解決這個問題?考慮到我不能使用:

  • 可空類型,因爲我應該在整個項目中修改很多代碼行;
  • 該表可能不包含Person的所有屬性,所以我不能在javascript中創建整個對象,然後只更改修改後的值。

我希望我和我的英語不好

+0

但是如果一個人的所有屬性都可以在該表中編輯,那麼應該發送所有這些值,而不管它們是否被更改。我的意思是,即使用戶只更改了名稱,你的JS函數也應該發送該行中的所有其他可編輯值。你不能像這樣修改你的JS嗎? – Shades88

+0

如果您沒有更改爲'Nullable ',我看不到任何明智的方式來區分*故意* 0和「未設置」0.坦率地說,有時候正確的做法是更改代碼。 –

+0

我希望有一些解決方法...創造性的解決方案;) – Webman

回答

0

ķ不夠清晰;如果我重新使用短語:您想要將所有具有非空值的屬性複製到現有對象上。那麼,第一個問題(你注意到)是你不能有一個intnull。幸運的是,你可以修復,通過簡單地把製作AgeId一個Nullable<int>,又名int?的務實步驟:

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

所以,現在我們只需要「複製所有非空值」。對於,看看this existing answer,這有點像你的反射方法,但是它使用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); 

它也可以進行調整,以做到就地合併在現有的對象之一。

+0

正如我在我原來的messagge中寫的,我不能使用Nullable類型,因爲我得到這個異常「不能隱式轉換類型'int?'到'int'。「:我不能修改每行代碼使用Person和所有其他對象/類,可以通過」編輯行「 – Webman

+0

@Webman修改,那麼你如何建議區分」合法「和「非法」使用任何價值? –

+0

例如,我正在尋找一種使用大負數的方法..但我認爲這不是可能的 – Webman