我正在尝试将树视图节点复制到treenodecollection以进行其他处理.当我执行treeview.nodes.clear()下一行时,我的treenodecollection变为null.您能告诉我如何将树视图节点复制到treenodecollection并保留节点的副本,即使在调用实际树视图节点的Clear方法之后也是如此?
TreeNodeCollection tnc = null;
private TypeIn()
{
tnc = treeView1.Nodes;
treeView1.Nodes.Clear();
//Now my tnc becomes null, but I want the tnc for future use.
}
Run Code Online (Sandbox Code Playgroud) 我终于设法复制了我的对象的值类型,一个使用字典来存储动态属性的类.我想知道两件事,单声道兼容性和效率.我是C#的新手,一般都有很多关于编程的知识,所以如果我滥用了几个短语就道歉:P
我用过这个方法你如何在.NET中做一个对象的深层复制(特别是C#)?...复制我的对象 我也会有数百个这样的对象,并且想知道以这种方式复制它们是非常低效的吗?结构会是更好的选择吗?但我不确定何时使用结构.它可以用单声道移植吗?一些谷歌搜索表明这种序列化可能会引发一个问题.
我正在尝试深度克隆包含System.Random变量的对象.我的应用程序必须是确定性的,因此我需要捕获随机对象状态.我的项目基于.Net Core 2.0.
我在这里使用了一些深度克隆代码(你如何在.NET(特别是C#)中对对象进行深度复制?)使用序列化.
System.Random的文档是混合的:
序列化
https://msdn.microsoft.com/en-us/library/system.random(v=vs.110).aspx
http://referencesource.microsoft.com/#mscorlib/system/random.cs,bb77e610694e64ca(源代码)
不可序列化
https://docs.microsoft.com/en-us/dotnet/api/system.random?view=netframework-4.7.1
https://docs.microsoft.com/en-us/dotnet/api/system.random?view=netcore-2.0
我收到以下错误.
System.Runtime.Serialization.SerializationException HResult = 0x8013150C Message =在程序集'System.Private.CoreLib中输入'System.Random',Version = 4.0.0.0,Culture = neutral,PublicKeyToken = 7cec85d7bea7798e'未标记为可序列化.来源= System.Runtime.Serialization.Formatters
System.Random可以按我想要的方式克隆吗?
我创建了一个小程序来说明.
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace RandomTest
{
class Program
{
static void Main(string[] args)
{
Container C = new Container();
Container CopyC = DeepClone(C);
}
public static T DeepClone<T>(T obj)
{
using(var ms = new MemoryStream())
{
var formatter = new BinaryFormatter();
formatter.Serialize(ms, obj); //<-- error here
ms.Position …Run Code Online (Sandbox Code Playgroud) 我使用第三方控件将一些数据导出为不同的格式.该控件有一个属性ExportSettings.但它是只读的.
我要手动设置它的属性,如
ctrl.ExportSettings.Paging = false;
ctr.ExportSettings.Background = Color.Red;
Run Code Online (Sandbox Code Playgroud)
所以我从用户那里得到了ExportSettings对象,我想把它设置为控件.
如何将其所有成员值复制到用户控件?
在一个应用程序中,我们有一组ORM对象和一组业务对象.大多数时候我们只是通过会员副本来做会员.其他时候我们稍微处理数据.例如:
tEmployee emp = new tEmployee();
emp.Name = obj.Name;
emp.LastName = obj.LastName;
emp.Age = obj.Age;
emp.LastEdited = obj.LastEdited.ToGMT();
Run Code Online (Sandbox Code Playgroud)
现在这个工作得很好,并且速度很快,但在编码方面并不完全简洁.我们的一些对象有多达40个成员,所以做这样的副本可能会变得相当繁琐.当然,你只需要两种方法来进行转换,但是我想找到一种更好的方法来实现这一点.
反射是一种自然的选择,但在基准测试中,我发现使用反射时执行时间大约慢了100倍.
有没有更好的方法来解决这个问题?
澄清:我正在从一种类型转换为另一种类型.在上面的例子中,obj的类型为BLogicEmployee,emp的类型为tEmployee.他们共享成员名称,但就是这样.
我有 2 个与 C# 中的类相同的对象。
Myclass obj1 = new Myclass();
Myclass obj2 = null;
obj2 = obj1;
obj1.Name = "abc"; //"abc" will also assign to obj2.Name.
Run Code Online (Sandbox Code Playgroud)
当我分配时obj1.Name="abc",它也会分配给obj2.Name. 我想阻止这一切。我已经尝试过 const, seal 但没有得到结果。有人能建议我如何停止对obj1on的引用obj2吗?
我想在 C# 核心中设置一个等于其他对象值的对象,而不是通过引用!
x.len=10;
val y=x;
y.len=x.len*2;
Run Code Online (Sandbox Code Playgroud)
我希望y.len设置为20,并x.len保持不变,但两者y.len和x.len是20,我正在寻找一种方式来断开x和y。
我记得在VB6 中我们有像ByRef和ByVal这样的东西,它们使我们能够控制这个东西,C# Core 3.x 中是否有类似的东西?
我有一个对象的List(在C#中)(我创建的类).我能够使用列表,但问题是我只创建(实例化我认为是正确的术语)我的一个对象类,并且我继续将它添加到列表中,即使该对象的属性随着代码的迭代而改变.我希望能够将硬编码对象添加到我的列表而不是参考对象.
这是我目前正在做的事情:
public class SaveData
{
public double save_property1;
public double save_property2;
}
in the application
SaveData newSaveData = new SaveData();
List<SaveData> newSaveDataList = new List<SaveData>;
if ( some condition)
{
newSaveData.save_property1 = x
}
if (some condition 2)
{
newSaveData.save_property2 = y
newSaveDataList.Add(SaveData); //
}
Run Code Online (Sandbox Code Playgroud)
由于X和Y在迭代中发生变化,我希望SaveDate我添加到列表中的对象不会随着每次迭代而改变(因此我可以保留Data对象的历史记录),即硬编码而不是用作参考.
我为问一些对C#伙计来说可能太基本的东西而道歉.我主要用C++编写代码.
所以,如果我想为我的班级编写一个赋值构造函数,我该怎么做?到目前为止,我有这个,但它似乎没有编译:
public class MyClass
{
public string s1;
public string s2;
public int v1;
public MyClass()
{
s1 = "";
s2 = "";
v1 = 0;
}
public MyClass(MyClass s)
{
this = s; //Error on this line
}
}
MyClass a = new MyClass();
MyClass b = new MyClass(a);
Run Code Online (Sandbox Code Playgroud) 所以我需要一种深度克隆的方法.我想要一张卡片列表等于另一张卡片列表,但我还想修改其中一个克隆.
我做了一个复制列表的方法,如下所示:
public List<Card> Copy(List<Card> cards)
{
List<Card> clone = new List<Card>();
foreach (var card in cards)
{
clone.Add(card);
}
return clone;
}
Run Code Online (Sandbox Code Playgroud)
并像这样使用它:
_cards = new List<Card>();
_thrownCards = new List<Card>();
_cards = Copy(_thrownCards);
_thrownCards.Clear();
Run Code Online (Sandbox Code Playgroud)
我没有C#的经验,但不知怎的,我的直觉告诉我,我的复制方法可以变得更简单.没有其他方法可以深度复制列表吗?我尝试使用MemberWiseClone,但这只是创建了对同一个对象的引用,而不是克隆它(可能我误解了MemberWiseClone方法).
有没有人有任何提示如何简单地克隆列表对象?
c# ×10
.net ×3
asp.net-core ×1
constructor ×1
copy ×1
deep-copy ×1
mono ×1
object ×1
performance ×1
random ×1
struct ×1