2008-11-16 36 views
0

這可能是一個簡單的問題。假設我有一個名爲Users的對象,它包含很多受保護的變量。有沒有一種快速的方法將一個相同對象的所有變量轉換爲C#中的另一個變量?

內部用戶級的我有一個創建一個臨時用戶對象,做了它,如果成功的話,所有傳送從臨時用戶對象中的變量到一個我有一個方法。

是否有一些快速的方法來將所有變量從一個用戶對象轉移到另一個用戶對象而無需使用C#執行此操作?

this.FirstName = temp.FirstName; 
this.LastName = temp.LastName; 
........75 variables later...... 
this.FavoriteColor = temp.FavoriteColor 

回答

3

更好的方法是實現IClonable接口。但是你會發現它並不能爲你節省很多工作。

0

一個更好的解決方案可能是移動無論這種方法是你的類外,然後就分配臨時用戶對象,以你的主要用戶對象的引用,象這樣:

_User = tmpUser; 

備用你的75行代碼。每當我有一個類在自己的方法中創建自己的實例時,我總是喜歡眨眼幾次,並確保我真的需要這樣做。

+0

我不知道這是不好的做法。如果我使用GetValue()調用DataReader,那該怎麼辦? – danmine 2008-11-16 13:43:47

1

我想序列化,然後反序列化一個對象將創建一個新的對象實例。這應該與前一個對象相同。

0

總是有反射選項。事情基本上類似於此:

public static void Copy(object source, object target) 
    { 
     foreach (System.Reflection.PropertyInfo pi in source.GetType().GetProperties()) 
     { 
      System.Reflection.PropertyInfo tpi = target.GetType().GetProperty(pi.Name); 
      if (tpi != null && tpi.PropertyType.IsAssignableFrom(pi.PropertyType)) 
      { 
       tpi.SetValue(target, pi.GetValue(source, null), null); 
      } 

     } 
    } 

不需要源和目標有什麼關係,什麼那麼以往任何時候都只是一個名字和IsAssignable檢查。它如果您使用的引用類型的任何地方有有趣的副作用,但對於那種你剛纔所描述的情況,這不是一個壞的選擇進行探索。

class sourceTester 
{ 
    public bool Hello { get; set; } 
    public string World { get; set; } 
    public int Foo { get; set; } 
    public List<object> Bar { get; set; } 
} 

class targetTester 
{ 
    public int Hello {get; set;} 
    public string World { get; set; } 
    public double Foo { get; set; } 
    public List<object> Bar { get; set; } 
} 

static void Main(string[] args) 
    { 


     sourceTester src = new sourceTester { 
      Hello = true, 
      World = "Testing", 
      Foo = 123, 
      Bar = new List<object>() 
     }; 

     targetTester tgt = new targetTester(); 

     Copy(src, tgt); 

     //Immediate Window shows the following: 
     //tgt.Hello 
     //0 
     //tgt.World 
     //"Testing" 
     //tgt.Foo 
     //0.0 
     //tgt.Bar 
     //Count = 0 
     //src.Bar.GetHashCode() 
     //59129387 
     //tgt.Bar.GetHashCode() 
     //59129387 
    } 
相關問題