有没有一种快速的方法可以将一个相同对象的所有变量转移到另一个C#中?

时间:2008-11-16 13:03:10

标签: c# oop

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

在Users类中,我有一个创建临时Users对象的方法,对它做了一些事情,如果成功,将所有变量从临时Users对象传输到我拥有的那个。

是否有一些快速方法可以将所有变量从一个Users对象传输到另一个Users对象而不使用C#进行此操作?

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

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

您应该在C#中查看克隆。

Deep cloning objects

答案 2 :(得分:1)

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

答案 3 :(得分:0)

更好的解决方案可能是移动此类方法不在您的类之外,然后将临时用户对象分配给主用户对象引用,如下所示:

_User = tmpUser;

免费提供75行代码。每当我有一个类在自己的方法中创建自己的实例时,我总是喜欢眨眼几次并确保我真的需要这样做。

答案 4 :(得分: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
    }