Clone()只有一个浅层副本,似乎没有直接的方法在C#中做这个没有一些样板代码包装序列化(如何在.NET中执行对象的深层复制(特别是C#)?).有没有一种简单的方法在Powershell中执行此操作而不引用外部库?
我正在使用来自第三方DLL的实例类,我需要在特定实例上进行深层复制.该类未标记为Serializable,因此我无法使用此建议的方法BinaryFormatter.
如何在不使用序列化的情况下获取此对象的深层副本?
我想使用自适应卡设计器创建(然后编辑)自适应卡设计,并在我的机器人中使用它们.
1)我在Designer中创建了自适应卡,带有样本值,并复制了它的JSON表示.例如:
{
"type": "AdaptiveCard",
"body": [
{
"type": "FactSet",
"id": "myFactSet",
"facts": [
{
"title": "Name:",
"value": "John Doe"
}
]
}
],
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"version": "1.0"
}
Run Code Online (Sandbox Code Playgroud)
2)现在我想在我的C#Bot Framework机器人中使用这张卡的设计.我把这个JSON放到我的项目中,其中包含了AdaptiveCards v1.1.0 nuget包.
3)我用这行代码将卡JSON解析为AdaptiveCards库类:
var card = AdaptiveCard.FromJson(card).Card;
Run Code Online (Sandbox Code Playgroud)
4)在将卡发送给用户之前,我必须用实际值填充它,替换样本数据.
如何"John Doe"使用真实用户名替换?什么是最简单的方法?(我已经写了一个扩展方法来获取AdaptiveElement它的id,所以我可以很容易地改变它的值.但请告诉我,如果有一个更简单的方法)
我如何克隆现有的AdaptiveElement并将其他值放入其中?例如,如果我想FactSet通过复制现有myFactSet的所有相同样式来添加另一个卡?AdaptiveElement没Clone()办法.
我希望能够使用Designer轻松编辑卡片的设计,但如果我用C#代码重写整张卡片,每次卡片的设计发生变化时我都要对其进行更改,我不会看到设计师的结果.
我知道用javascript很容易做到,但我在我的机器人中使用C#.
我也明白,我可以解析卡片JsonObject并直接处理JsonObjects,克隆它们,改变它们的属性,但是
它们没有输入,因此没有IntelliSense支持,我可以输入错字
我仍然需要遍历所有元素以找到具有给定id的那个元素(顺便说一句,是否有一个扩展方法可以轻松地执行此操作?)
使用JsonObject不会消除AdaptiveCards库的需要和调用AdaptiveCard.FromJson(card) …
我最近注意到我们的一个应用程序中出现了一种奇怪的行为。
Exception=System.InvalidCastException: Unable to cast object of type 'System.Data.SqlClient.SqlTransaction' to type 'System.Byte[]'.
at ServiceStack.Text.Pools.BufferPool.GetCachedBuffer(Int32 minSize) in C:\BuildAgent\work\912418dcce86a188\src\ServiceStack.Text\Pools\BufferPool.cs:line 55
at ServiceStack.Redis.RedisNativeClient..ctor(RedisEndpoint config) in C:\BuildAgent\work\b2a0bfe2b1c9a118\src\ServiceStack.Redis\RedisNativeClient_Utils.cs:line 447
at ServiceStack.Redis.RedisClient..ctor(RedisEndpoint config) in C:\BuildAgent\work\b2a0bfe2b1c9a118\src\ServiceStack.Redis\RedisClient.cs:line 66
at ServiceStack.Redis.RedisConfig.<>c.<.cctor>b__35_0(RedisEndpoint c) in C:\BuildAgent\work\b2a0bfe2b1c9a118\src\ServiceStack.Redis\RedisConfig.cs:line 22
at ServiceStack.Redis.RedisResolver.CreateRedisClient(RedisEndpoint config, Boolean master) in C:\BuildAgent\work\b2a0bfe2b1c9a118\src\ServiceStack.Redis\RedisResolver.cs:line 76
at ServiceStack.Redis.RedisManagerPool.GetClient() in C:\BuildAgent\work\b2a0bfe2b1c9a118\src\ServiceStack.Redis\RedisManagerPool.cs:line 214
Run Code Online (Sandbox Code Playgroud)
...
或者
Exception=System.InvalidCastException: Unable to cast object of type 'System.Byte[]' to type 'System.Transactions.SafeIUnknown'.
at System.Transactions.Transaction.JitSafeGetContextTransaction(ContextData contextData)
at System.Transactions.Transaction.FastGetTransaction(TransactionScope currentScope, ContextData contextData, Transaction& contextTransaction)
at System.Transactions.Transaction.get_Current()
at System.Data.ProviderBase.DbConnectionPool.GetFromTransactedPool(Transaction& transaction)
at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, …Run Code Online (Sandbox Code Playgroud) 可能重复:
在C#中克隆对象
我有一个包含属性的类,其中一些是引用类型(其他类的实例)本身(CookieContainer).
我想拥有此类的精确副本,因此对先前版本的任何更改都不会影响此新实例.
是否存在针对此类问题的一般解决方案,或者我应该手动执行此操作?
是否有一种简单的方法可以基本上只使用此方法获取数据的副本而不是引用?我试过.ToArray().Where()但似乎仍然传递了一个引用.
例:
static void Main(string[] args)
{
List<ob> t = new List<ob>();
t.Add(new ob() { name = "hello" });
t.Add(new ob() { name = "test" });
ob item = t.Where(c => c.name == "hello").First();
// Changing the name of the item changes the original item in the list<>
item.name = "burp";
foreach (ob i in t)
{
Console.WriteLine(i.name);
}
Console.ReadLine();
}
public class ob
{
public string name;
}
Run Code Online (Sandbox Code Playgroud) 我有从一个线程写入的generic Queue<T>(System.Collections.Generic).并且必须从另一个线程访问它以进行读取.
ConcurrentQueue<T>出于性能原因,我不想进行任何进程同步(包括使用).所以我想出了将整个队列复制到阅读线程中相同类型的另一个队列对象的想法.阅读线程中的后续操作将在副本上完成.复制将通过简单的操作员完成=.
这是一些伪代码:
//Creating main queue
Queue<MyType> queue1 = new Queue<MyType>();
Run Code Online (Sandbox Code Playgroud)
写线程:
//Perform writing in the main queue
queue1.Enqueue(object);
...
queue1.Dequeue();
Run Code Online (Sandbox Code Playgroud)
阅读帖子:
//Copy main queue
Queue<MyType> queue2 = queue1;
//perform all operations in reading thread on queue2
Run Code Online (Sandbox Code Playgroud)
这样的解决方案线程安全吗?
UPD:非常感谢,我不知道这只是复制链接.那么有没有办法以线程安全的方式按值复制整个对象?
我正在研究一些用C#编写的代码.在这个应用程序中,我有一个自定义集合定义如下:
public class ResultList<T> : IEnumerable<T>
{
public List<T> Results { get; set; }
public decimal CenterLatitude { get; set; }
public decimal CenterLongitude { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
Results使用的类型是三种自定义类型之一.每个自定义类型的属性只是基本类型(整数,字符串,bools,int?,bool?).以下是其中一种自定义类型的示例:
public class ResultItem
{
public int ID { get; set; }
public string Name { get; set; }
public bool? isLegit { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如何执行我创建的ResultList对象的深层副本.我发现这篇文章:创建集合中所有元素的深层副本的通用方法.但是,我无法弄清楚如何做到这一点.
所以我在这个主题上发现了一堆线索,但我认为我找不到适用的线程.
基本上我的.exe加载一个.dll(MyAssembly)文件,它执行序列化和加载.显然它序列化很好.
但是,当我在MyAssembly.dll文件中反序列化文件时,它会爆炸,并显示此帖子标题中的错误.
有人有主意吗?我不明白它怎么找不到调用代码的程序集!
我的代码:
// deserialize
using (var target = new System.IO.FileStream(Path, System.IO.FileMode.OpenOrCreate))
{
var bin = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
var Obj = bin.Deserialize(target);
if (Obj != null)
{
ObjectToStore = (ObjectTypeInMyAssembly)Obj;
}
}
// serialize
using (var target = new System.IO.FileStream(Path, System.IO.FileMode.OpenOrCreate))
{
var bin = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
bin.Serialize(target, ObjectToStore);
}
Run Code Online (Sandbox Code Playgroud) 我终于设法复制了我的对象的值类型,一个使用字典来存储动态属性的类.我想知道两件事,单声道兼容性和效率.我是C#的新手,一般都有很多关于编程的知识,所以如果我滥用了几个短语就道歉:P
我用过这个方法你如何在.NET中做一个对象的深层复制(特别是C#)?...复制我的对象 我也会有数百个这样的对象,并且想知道以这种方式复制它们是非常低效的吗?结构会是更好的选择吗?但我不确定何时使用结构.它可以用单声道移植吗?一些谷歌搜索表明这种序列化可能会引发一个问题.
c# ×8
.net ×2
deep-copy ×2
botframework ×1
collections ×1
immutability ×1
instance ×1
lambda ×1
linq ×1
mono ×1
performance ×1
powershell ×1
struct ×1