相关疑难解决方法(0)

如何在运行时将多次在XAML ResourceDictionary中定义的Path添加到WPF表单?

我在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)

c# wpf xaml resourcedictionary

11
推荐指数
2
解决办法
6897
查看次数

C#中引用类型的值赋值

按引用类型的值实现赋值的正确方法是什么?我想执行一项任务,但不更改参考.

这就是我在说的:

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实例的类都受上面代码行的影响.

我希望这能澄清我的问题.谢谢.

.net c#

9
推荐指数
2
解决办法
1万
查看次数

如何从DataContext的跟踪机制中分离LINQ-to-SQL数据对象?

在询问了这个问题后,我被告知该Table<T>.Attach()方法是如何工作的,我还有另外一个问题.

如何从DataContext状态跟踪机制中分离LINQ-to-SQL数据对象?基本上,我想拉一条记录并更改记录上的数据.但是,当我调用SubmitChanges()同一个DataContext实例时,除非我明确调用,否则我不希望更新记录Attach().这是如何完成的?

c# linq datacontext linq-to-sql

9
推荐指数
2
解决办法
1万
查看次数

c#Thread Safe Deep Copy

我一直在阅读很多其他问题以及很多谷歌搜索,我一直无法找到一个明确的解决方案.

基于我读过的一些最佳实践,类的静态方法应该是线程安全的,实例成员应该为消费者提供线程安全性.

我想为该类实现深度复制方法.该类本身具有其他引用类型成员.有没有办法使深度复制方法线程安全,而不必将开销强加给类的所有实例成员?

c# locking deep-copy thread-safety

9
推荐指数
1
解决办法
3164
查看次数

复制对象属性:反射或序列化 - 哪个更快?

我有两个相同类型的对象,需要将属性值从一个对象复制到另一个对象.有两种选择:

  1. 使用反射,浏览第一个对象的属性并复制值.

  2. 序列化第一个对象并反序列化副本.

两者都符合我的要求,问题是我在速度(成本)方面更好地使用哪些?

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 p1Person 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)

c# serialization deep-copy shallow-copy deserialization

9
推荐指数
2
解决办法
2万
查看次数

复杂第三方对象/类的深层复制

我一直致力于使用PDFView4Net创建PDF表单的项目.虽然库通常很好,但在使用表单字段(即文本框,复选框等)时,表单创建器是原始的并且缺少基本功能(例如复制/粘贴,对齐,格式化等).

问题:我一直在扩展字段对象的功能,并在复制/粘贴时被绊倒.要做到这一点,我需要一个对象的深层副本,而不需要引用任何原始对象.我通过电子邮件发送给供应商,要求提供有关他们推荐的复制这些对象的方法的信息,他们回复说我需要手工制作每个属性的副本,手动...在桌面上敲打.这些是大类,具有多个嵌入类作为属性,以及UI元素.

问题:是否有任何好的方法可以为不需要序列化的复杂对象执行深层复制,不需要访问或更改源类,也不需要默认构造函数?

我尝试过/审查过的内容:我研究了各种方法来制作一个对象的深层副本并逐个丢弃它们:

  • 通过苦心财产手动获取属性:我尝试使用7个字段对象中的第一个(PDFTextBoxField),但它很快就失控了,这些属性也是不同类型的类.最后,我仍然对原始对象进行了延迟引用,其中创建了一个浅层副本,而不是按照预期创建了一个深层副本.
  • 序列化:类没有标记为Serializable,供应商也不会更改它.我问他们,他们说没有.
  • ICloneable:需要由供应商实施.
  • AutoMapper:这似乎是用于将数据从一个或多个对象类型复制到另一个对象类型.我正在使用的对象是相同的类型.虽然我不反对使用它,但它是最好的解决方案.
  • Emit Mapper:这个项目似乎已被放弃.
  • MemberwiseClone:是一个浅层副本,而不是我正在寻找的深层副本,尽管当提问者特别要求深层复制时,这在大量其他帖子中被建议.
  • Value Injecter:我在CodePlex上从ValueInjecter实现了FastDeepCloneInjection,但是大多数需要注入的类都没有0参数构造函数,这在为副本创建新实例时是必需的.ValueInjecter不允许跳过某些属性,或者我只是跳过没有默认构造函数的项,并将它们设置为null(默认值).第一堂课就是我立刻遇到的.为了解决这个问题,我创建了一个从原始继承的包装类,并将原始文件转换为包装器(反之亦然),但我不认为这是一个很好的解决方案.

编辑:我真的不觉得这个问题是重复的.我已经广泛搜索了一个解决方案,包括标记为重复/原始的帖子,但无法找到满意的解决方案.如上所述,我无权更改我需要复制的类.这折扣了DataContractSerializer,BinaryFormatter和任何其他类型的序列化.这也打破了我使用Activator.CreateInstance看到的反射示例,因为我需要复制的类中大约95%没有带0参数的构造函数.这与我使用ValueInjecter遇到的问题相同.这也使用ICloneable进行折扣.

c# clone deep-copy automapper valueinjecter

8
推荐指数
1
解决办法
1091
查看次数

基类方法可以返回派生类的类型吗?

基于我读过的其他帖子,似乎这可能是不可能的,但我想我会发布我想要做的事情,看看是否有人知道解决方案.

我正在尝试向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# inheritance base-class

8
推荐指数
1
解决办法
1585
查看次数

如何制作参考类型的副本

可能重复:
在C#中克隆对象

我有一个包含属性的类,其中一些是引用类型(其他类的实例)本身(CookieContainer).

我想拥有此类的精确副本,因此对先前版本的任何更改都不会影响此新实例.

是否存在针对此类问题的一般解决方案,或者我应该手动执行此操作?

c# immutability reference-type

7
推荐指数
1
解决办法
2万
查看次数

System.Runtime.Serialization.SerializationException:无法找到程序集MyAssembly

所以我在这个主题上发现了一堆线索,但我认为我找不到适用的线程.

基本上我的.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# serialization

7
推荐指数
3
解决办法
2万
查看次数

c#copy构造函数生成器

我想将值从一个对象复制到另一个对象.类似于传递值但具有赋值的东西.

例如:

PushPin newValPushPin = oldPushPin; //I want to break the reference here.
Run Code Online (Sandbox Code Playgroud)

有人告诉我为此写一个拷贝构造函数.但是这个类有很多属性,手工编写复制构造函数可能需要一个小时.

  1. 有没有更好的方法通过值将对象分配给另一个对象?
  2. 如果没有,是否有复制构造函数生成器?

注意:Silverlight中不提供ICloneable.

c# silverlight

6
推荐指数
2
解决办法
1942
查看次数