C# 将一个类复制到另一个类?
我有 如何将A复制到另一个A?在C++中,我知道我可以做<代码> *a1**2;<代码>。C#中有类似的东西吗?我知道我可以使用反射编写一个通用的解决方案,但我希望已经存在一些东西 我正在考虑将A更改为可为空的结构 第二步我需要做C# 将一个类复制到另一个类?,c#,.net,class,copy,C#,.net,Class,Copy,我有 如何将A复制到另一个A?在C++中,我知道我可以做 *a1**2;。C#中有类似的东西吗?我知道我可以使用反射编写一个通用的解决方案,但我希望已经存在一些东西 我正在考虑将A更改为可为空的结构 第二步我需要做 class A { public int a; public string b; } 然后将基础数据从B复制到C。假设A只是一个简单的类,您可以这样做 class B : A {} class C : A {} MemberwiseClone()是一个浅拷贝,因此
class A
{
public int a;
public string b;
}
然后将基础数据从B复制到C。假设A只是一个简单的类,您可以这样做
class B : A {}
class C : A {}
MemberwiseClone()是一个浅拷贝,因此如果您的类变得复杂,并且属性也是引用类型,那么这将不适用于您。有
iclonable
接口,它提供了Clone()
方法
您可以克隆,也可以定义复制构造函数。为什么要把类变成结构,因为C++中你可以用10个字符来做一些事情。C#是不同的。结构有优点也有缺点。添加适当的构造函数:
A newA = instanceOfA.MemberwiseClone();
<>你也应该考虑使它不可变,特别是当你考虑把它变成一个结构的时候。可变结构是邪恶的
最后,当您从类继承时,不需要将成员从基类复制到子类。我使用了二进制序列化。基本上,将实例序列化为内存流。然后,将其从内存流中反序列化。您将拥有一份精确的二进制副本。这将是一个深度拷贝,而不是浅拷贝
class Foo
{
public Foo(int a, string b)
{
A = a;
B = b;
}
public Foo(Foo other)
{
A = other.A;
B = other.B;
}
public int A { get; set; }
public string B { get; set; }
}
对于浅层复制,您可以使用Object.MemberwiseClone以下是一些人已经做过的事情
这里有一些简单的代码,可用于任何类,而不仅仅是基类
class a = new ClassA();
class b = MySerializationMethod(a);
我们已成功使用此代码:
public static void DuckCopyShallow(this Object dst, object src)
{
var srcT = src.GetType();
var dstT= dst.GetType();
foreach(var f in srcT.GetFields())
{
var dstF = dstT.GetField(f.Name);
if (dstF == null || dstF.IsLiteral)
continue;
dstF.SetValue(dst, f.GetValue(src));
}
foreach (var f in srcT.GetProperties())
{
var dstF = dstT.GetProperty(f.Name);
if (dstF == null)
continue;
dstF.SetValue(dst, f.GetValue(src, null), null);
}
}
使用系统;
使用System.IO;
使用System.Runtime.Serialization.Formatters.Binary;
命名空间实用程序{
内部静态类ObjectCloner{
公共静态T克隆(T obj){
使用(MemoryStream buffer=new MemoryStream()){
BinaryFormatter formatter=新的BinaryFormatter();
序列化(缓冲区,obj);
缓冲器位置=0;
反序列化(缓冲区);
返回温度;
}
}
}
}
也许还有其他更好的方法,但也许这会对你有所帮助
Chris尽管这不能像无反射方法那样快。同意。不过,它比定制方法更方便、更具可扩展性。如果我今天有足够的选票,我会得到+1。不可变意味着没有集合属性,对吗?@lpthnc:
private set
可以。谢谢。如果你想让get保持为公共的——在同一条线上还是单独的?@Ipthnc:public int A{get;private set;}你已经在这里问过了:@yodaj007:这个人从这个问题上澄清了他的想法。我已经投票决定关闭旧的,因为我已经用C++编码了一段时间。您的示例只确保a1
和a2
都指向内存中的同一个对象,因此其中一个对象中的更改会同时反映在这两个对象中,对吗?所以它不是真的复制到另一个A
,对吗?不是。*obj=与obj=不同。obj=在*obj复制时更改指针。我最近也遇到了类似的问题,并提出了一个通用方法-它确实使用反射:+1作为此方法。我们已经使用过很多次了,效果很好。它看起来像Object.MemberwiseClone只适用于两个相同的类,并且在类方法中?我如何编程MySerializationMethod?似乎我将使用反射。有人在下面发布了它:不需要反射
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace Utility {
internal static class ObjectCloner {
public static T Clone<T>(T obj) {
using (MemoryStream buffer = new MemoryStream()) {
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(buffer, obj);
buffer.Position = 0;
T temp = (T)formatter.Deserialize(buffer);
return temp;
}
}
}
}