【问题标题】:Is there a fast way to transfer all the variables of one identical object into another in C#?有没有一种快速的方法可以在 C# 中将一个相同对象的所有变量转移到另一个对象中?
【发布时间】:2008-11-16 13:03:10
【问题描述】:

这可能是一个简单的问题。假设我有一个名为 Users 的对象,它包含很多受保护的变量。

在该 Users 类中,我有一个创建临时 Users 对象的方法,对它执行一些操作,如果成功,则将所有变量从 temp Users 对象转移到我拥有的对象中。

是否有一些快速的方法可以将所有变量从一个用户对象转移到另一个用户对象而不使用 C#?

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

【问题讨论】:

    标签: c# oop


    【解决方案1】:

    更好的方法是实现 IClonable 接口。但是你会发现它并没有为你节省很多工作。

    【讨论】:

      【解决方案2】:

      您应该检查一下 C# 中的克隆。

      Deep cloning objects

      【讨论】:

        【解决方案3】:

        我认为序列化然后反序列化一个对象会创建一个新的对象实例。这应该与前一个对象相同。

        【讨论】:

          【解决方案4】:

          更好的解决方案可能是将这个方法移到你的类之外,然后将临时用户对象分配给你的主用户对象引用,如下所示:

          _User = tmpUser;
          

          为您节省 75 行代码。每当我有一个类在它自己的方法中创建一个自己的实例时,我总是喜欢眨几下,确保我真的需要这样做。

          【讨论】:

          • 我不知道这是不好的做法。如果我用 GetValue() 调用 DataReader 怎么样?
          • @MusiGenesis:工厂方法虽然很标准,但比公共构造函数有很多优势。
          • @Jon:这听起来像这里发生的事情吗?
          • @Danmine:你能发布更多你的方法吗?我很想知道你想在那里做什么。
          【解决方案5】:

          总是有反射选项。与此基本相似的东西:

          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
              }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-02-07
            • 1970-01-01
            • 2014-12-06
            • 2022-01-06
            • 1970-01-01
            • 1970-01-01
            • 2014-02-26
            • 1970-01-01
            相关资源
            最近更新 更多