我在XAML中有一个已定义的路径:
<UserControl.Resources>
<ResourceDictionary>
<Path x:Key="N44" Width="20" Height="80" Stretch="Fill" Fill="#FF000000" Data="M 20,25.2941L 20,29.4118L 15.9091,29.4118L 15.9091,40L 12.2727,40L 12.2727,29.4118L 2.54313e-006,29.4118L 2.54313e-006,25.6985L 13.4872,7.62939e-006L 15.9091,7.62939e-006L 15.9091,25.2941L 20,25.2941 Z M 12.2727,25.2941L 12.2727,5.28493L 2.09517,25.2941L 12.2727,25.2941 Z M 20,65.2941L 20,69.4118L 15.9091,69.4118L 15.9091,80L 12.2727,80L 12.2727,69.4118L -5.08626e-006,69.4118L -5.08626e-006,65.6985L 13.4872,40L 15.9091,40L 15.9091,65.2941L 20,65.2941 Z M 12.2727,65.2941L 12.2727,45.2849L 2.09517,65.2941L 12.2727,65.2941 Z "/>
</ResourceDictionary>
</UserControl.Resources>
Run Code Online (Sandbox Code Playgroud)
我想将它添加到WPF Gird并像这样工作一次:
System.Windows.Shapes.Path aPath = new System.Windows.Shapes.Path();
aPath = (System.Windows.Shapes.Path)this.Resources["N44"];
LayoutRoot.Children.Add(aPath);
Run Code Online (Sandbox Code Playgroud)
但是,如果我在按钮单击事件上添加此代码,然后单击该按钮两次,则会引发错误
"指定的Visual已经是另一个Visual的子项或CompositionTarget的根."
然后我尝试创建资源的两个实例,但我继续收到相同的错误.以下是我用于此测试的代码:
private void cmbTest_Click(object sender, System.Windows.RoutedEventArgs e)
{
System.Windows.Shapes.Path aPath = new System.Windows.Shapes.Path();
aPath = …Run Code Online (Sandbox Code Playgroud) 按引用类型的值实现赋值的正确方法是什么?我想执行一项任务,但不更改参考.
这就是我在说的:
void Main()
{
A a1 = new A(1);
A a2 = new A(2);
a1 = a2; //WRONG: Changes reference
a1.ValueAssign(a2); //This works, but is it the best way?
}
class A
{
int i;
public A(int i)
{
this.i = i;
}
public void ValueAssign(A a)
{
this.i = a.i;
}
}
Run Code Online (Sandbox Code Playgroud)
我应该使用某种惯例吗?我觉得我不是第一个遇到这种情况的人.谢谢.
编辑:
哇.我想我需要针对我面临的实际问题更多地调整我的问题.我得到了很多答案,不符合不改变参考的要求.克隆不是问题所在.问题在于分配克隆.
我有许多依赖于A的类 - 它们都共享对A类相同对象的引用.因此,每当一个类改变A时,它就反映在其他类中,对吧?这一切都很好,直到其中一个类试图这样做:
myA = new A();
Run Code Online (Sandbox Code Playgroud)
实际上我不是在做,new A()但我实际上正在从硬盘驱动器中检索A的序列化版本.但无论如何,这样做会导致myA收到新的参考.它不再与依赖于A的其他类共享相同的A.这是我试图解决的问题.我希望所有具有A实例的类都受上面代码行的影响.
我希望这能澄清我的问题.谢谢.
在询问了这个问题后,我被告知该Table<T>.Attach()方法是如何工作的,我还有另外一个问题.
如何从DataContext状态跟踪机制中分离LINQ-to-SQL数据对象?基本上,我想拉一条记录并更改记录上的数据.但是,当我调用SubmitChanges()同一个DataContext实例时,除非我明确调用,否则我不希望更新记录Attach().这是如何完成的?
我一直在阅读很多其他问题以及很多谷歌搜索,我一直无法找到一个明确的解决方案.
基于我读过的一些最佳实践,类的静态方法应该是线程安全的,实例成员应该为消费者提供线程安全性.
我想为该类实现深度复制方法.该类本身具有其他引用类型成员.有没有办法使深度复制方法线程安全,而不必将开销强加给类的所有实例成员?
我有两个相同类型的对象,需要将属性值从一个对象复制到另一个对象.有两种选择:
使用反射,浏览第一个对象的属性并复制值.
序列化第一个对象并反序列化副本.
两者都符合我的要求,问题是我在速度(成本)方面更好地使用哪些?
例
class Person
{
public int ID { get; set; }
public string Firsthand { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
public decimal Weight { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
需要的属性值从复制Person p1到Person p2.
对于这个简单的样本 - 哪种方法更快?
更新
对于序列化,我使用此处建议的ObjectCopier:深度克隆对象
对于反射,我使用此代码:
foreach (PropertyInfo sourcePropertyInfo in copyFromObject.GetType().GetProperties())
{
PropertyInfo destPropertyInfo = copyToObject.GetType().GetProperty(sourcePropertyInfo.Name);
destPropertyInfo.SetValue(
copyToObject,
sourcePropertyInfo.GetValue(copyFromObject, null),
null);
}
Run Code Online (Sandbox Code Playgroud) 我一直致力于使用PDFView4Net创建PDF表单的项目.虽然库通常很好,但在使用表单字段(即文本框,复选框等)时,表单创建器是原始的并且缺少基本功能(例如复制/粘贴,对齐,格式化等).
问题:我一直在扩展字段对象的功能,并在复制/粘贴时被绊倒.要做到这一点,我需要一个对象的深层副本,而不需要引用任何原始对象.我通过电子邮件发送给供应商,要求提供有关他们推荐的复制这些对象的方法的信息,他们回复说我需要手工制作每个属性的副本,手动...在桌面上敲打.这些是大类,具有多个嵌入类作为属性,以及UI元素.
问题:是否有任何好的方法可以为不需要序列化的复杂对象执行深层复制,不需要访问或更改源类,也不需要默认构造函数?
我尝试过/审查过的内容:我研究了各种方法来制作一个对象的深层副本并逐个丢弃它们:
编辑:我真的不觉得这个问题是重复的.我已经广泛搜索了一个解决方案,包括标记为重复/原始的帖子,但无法找到满意的解决方案.如上所述,我无权更改我需要复制的类.这折扣了DataContractSerializer,BinaryFormatter和任何其他类型的序列化.这也打破了我使用Activator.CreateInstance看到的反射示例,因为我需要复制的类中大约95%没有带0参数的构造函数.这与我使用ValueInjecter遇到的问题相同.这也使用ICloneable进行折扣.
基于我读过的其他帖子,似乎这可能是不可能的,但我想我会发布我想要做的事情,看看是否有人知道解决方案.
我正在尝试向Telerik Open Access域模型生成的类添加"Clone()"方法.没问题.我能够弄清楚如何将基类添加到生成的实体模型中,以便我可以通过它们的基类来识别这些类.(所有实体都从基类继承)
我希望所有这些实体模型类能够克隆自己.我也找到了解决方案.(深度克隆对象)
现在我有一个基类,我想在每个从该基类派生的类中添加一个Clone()函数.所以......似乎基类是放置它的自然场所......对吗?
public abstract class DBEntityBase
{
/// <summary>
/// Gets a COPY of the instance in it's current state
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
protected T Clone<T>()
{
return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(this));
}
}
Run Code Online (Sandbox Code Playgroud)
我添加了受保护的泛型Clone()方法,因为在基类级别我们不知道我们正在克隆的类型.Clone()方法需要由实体模型本身实现,以便提供克隆的特定类型.
public partial class DeliverableEntity
{
public new DeliverableEntity Clone()
{
return this.Clone<DeliverableEntity>();
}
}
Run Code Online (Sandbox Code Playgroud)
这工作正常,但不保证派生类将公开公开Clone()方法,因此我向基础添加了一个抽象Clone()方法,这将要求派生类实现公共Clone()方法.
public abstract class DarkRoomDBEntityBase
{
/// <summary>
/// Gets a COPY of the …Run Code Online (Sandbox Code Playgroud) 可能重复:
在C#中克隆对象
我有一个包含属性的类,其中一些是引用类型(其他类的实例)本身(CookieContainer).
我想拥有此类的精确副本,因此对先前版本的任何更改都不会影响此新实例.
是否存在针对此类问题的一般解决方案,或者我应该手动执行此操作?
所以我在这个主题上发现了一堆线索,但我认为我找不到适用的线程.
基本上我的.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) 我想将值从一个对象复制到另一个对象.类似于传递值但具有赋值的东西.
例如:
PushPin newValPushPin = oldPushPin; //I want to break the reference here.
Run Code Online (Sandbox Code Playgroud)
有人告诉我为此写一个拷贝构造函数.但是这个类有很多属性,手工编写复制构造函数可能需要一个小时.
注意:Silverlight中不提供ICloneable.
c# ×10
deep-copy ×3
.net ×1
automapper ×1
base-class ×1
clone ×1
datacontext ×1
immutability ×1
inheritance ×1
linq ×1
linq-to-sql ×1
locking ×1
shallow-copy ×1
silverlight ×1
wpf ×1
xaml ×1