gpt4 book ai didi

c# - 为什么这个克隆不起作用?

转载 作者:太空宇宙 更新时间:2023-11-03 20:26:39 25 4
gpt4 key购买 nike

我正在尝试克隆派生类的实例,但不知何故效果不佳。克隆方法是:

public static T CloneFieldsAndProperties<T>(T input)
{
T result = (T)Activator.CreateInstance(typeof(T));
PropertyInfo[] listOfProps = typeof(T).GetProperties(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.FlattenHierarchy | BindingFlags.CreateInstance);
FieldInfo[] listOfFields = typeof(T).GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.FlattenHierarchy | BindingFlags.CreateInstance);
foreach (PropertyInfo prop in listOfProps) prop.SetValue(result, prop.GetValue(input, null), null);
foreach (FieldInfo field in listOfFields) field.SetValue(result, field.GetValue(input));
return result;
}

如您所见,我添加了许多 BindingFlags,因为它不起作用。但无济于事。

确实在简单的情况下工作:

MyclassA1 a1 = new MyclassA1();
MyclassA a = CloneFieldsAndProperties(a1);
if (a is MyclassA1) Text = "Works";

地点:

class MyclassA
{
public int i;
}

class MyclassA1 : MyclassA
{
public int i1;
}

但在我的真实程序中它没有。真实程序的类声明很长,所以我不在这里张贴它们。可能是什么问题?

最佳答案

很久以前我也遇到过同样的问题。经过大量谷歌搜索后,对我来说唯一真正的解决方案是对其进行序列化和反序列化。这不是一个糟糕的解决方案,您只会损失一点点性能,只需这样做:

将这个标签添加到你的类中:

[Serializable()]
public class a
{

}

然后你可以像这样创建一个函数:

public object Clone()
{
IO.MemoryStream mem = new IO.MemoryStream();
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter form = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
form.Serialize(mem, this);
mem.Position = 0;
return form.Deserialize(mem);
}

关于c# - 为什么这个克隆不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10268558/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com