相关疑难解决方法(0)

复制对象并使用复制而不更改原始

假设我有一个Object ItemVO,其中已经分配了一堆属性.例如:

ItemVO originalItemVO = new ItemVO();
originalItemVO.ItemId = 1;
originalItemVO.ItemCategory = "ORIGINAL";
Run Code Online (Sandbox Code Playgroud)

我想通过使用以下方法创建另一个副本:

duplicateItemVO = originalItemVO;
Run Code Online (Sandbox Code Playgroud)

然后使用duplicateItemVO并更改其'属性,而不更改originalItemVO:

// This also change the originalItemVO.ItemCategory which I do not want.
duplicateItemVO.ItemCategory = "DUPLICATE" 
Run Code Online (Sandbox Code Playgroud)

如何在不更改ItemVO类的情况下实现此目的?

谢谢

public class ItemVO     
{
    public ItemVO()
    {
        ItemId = "";
        ItemCategory = "";
    }

    public string ItemId { get; set; }
    public string ItemCategory { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

c#

27
推荐指数
6
解决办法
5万
查看次数

从父对象创建子对象实例的最佳方法

我正在从父对象创建一个子对象.所以场景是我有一个对象和一个子对象,它为我想要搜索的场景添加了一个距离属性.我选择使用继承,因为我的UI与搜索对象或对象列表等效地工作,而不是位置搜索的结果.所以在这种情况下,继承似乎是一个明智的选择.

目前我需要MyObjectSearch从一个实例生成一个新对象MyObject.目前我通过逐个设置属性手动在构造函数中执行此操作.我可以使用反射,但这会很慢.有没有更好的方法来实现这种对象增强?

希望下面的代码说明了这个场景.

public class MyObject {

    // Some properties and a location.
}

public class MyObjectSearch : MyObject {

    public double Distance { get; set; }

    public MyObjectSearch(MyObject obj) {
         base.Prop1 = obj.Prop1;
         base.Prop2 = obj.Prop2;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的搜索功能:

public List<MyObjectSearch> DoSearch(Location loc) { 
  var myObjectSearchList = new List<MyObjectSearch>();       

   foreach (var object in myObjectList) {
       var distance = getDistance();
       var myObjectSearch = new MyObjectSearch(object);
       myObjectSearch.Distance = distance;
       myObjectSearchList.add(myObjectSearch);
   } 
   return myObjectSearchList;
Run Code Online (Sandbox Code Playgroud)

}

.net c# inheritance objectinstantiation

24
推荐指数
4
解决办法
3万
查看次数

有没有更好的方法在C#中创建深度和浅层克隆?

我一直在为项目创建对象,有些实例我必须为这些对象创建一个深层副本我已经想到了使用C#的内置函数,即MemberwiseClone().困扰我的问题是每当我创建一个新类时,我都必须编写一个类似下面代码的函数来进行浅拷贝.有人请帮助我改进这部分并给我一个更好的浅拷贝比第二行代码.谢谢 :)

SHALLOW COPY:

public static RoomType CreateTwin(RoomType roomType)
{
    return (roomType.MemberwiseClone() as RoomType);
}
Run Code Online (Sandbox Code Playgroud)

深度复制:

public static T CreateDeepClone<T>(T source)
{
    if (!typeof(T).IsSerializable)
    {
        throw new ArgumentException("The type must be serializable.", "source");
    }

    if (Object.ReferenceEquals(source, null))
    {
        return default(T);
    }

    IFormatter formatter = new BinaryFormatter();
    Stream stream = new MemoryStream();
    using (stream)
    {
        formatter.Serialize(stream, source);
        stream.Seek(0, SeekOrigin.Begin);
        return (T)formatter.Deserialize(stream);
    }
}
Run Code Online (Sandbox Code Playgroud)

.net c# oop cloning

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

使用C#将属性值复制到另一个对象

要将属性值从一个对象复制到另一个对象,我们通常使用以下语法实现:

ca.pro1 = cb.pro2;
ca.pro2 = cb.pro2;
Run Code Online (Sandbox Code Playgroud)

其中ca和cb属于同一类.

有没有更简单的synatx或实用方法来帮助我们达到同样的效果?

谢谢.

c#

21
推荐指数
4
解决办法
8万
查看次数

C# 中的“with”运算符是什么?

我遇到过这段代码:

var rectangle = new Rectangle(420, 69);
var newOne = rectangle with { Width = 420 }
Run Code Online (Sandbox Code Playgroud)

我想知道withC# 代码中的关键字。它是做什么用的?以及如何使用它?它给语言带来了什么好处?

.net c# expression keyword c#-9.0

18
推荐指数
2
解决办法
8951
查看次数

如何深度复制类而不将其标记为Serializable

鉴于以下课程:

class A
{
    public List<B> ListB;

    // etc...
}
Run Code Online (Sandbox Code Playgroud)

哪个B是可以继承/包含其他类的另一个类.


鉴于这种情况:

  1. A 是一个大类,包含许多引用类型
  2. 我无法标记B,[Serializable]因为我无法访问源代码B

以下执行深度复制的方法不起作用:

  1. 我不能使用ICloneableMemberwiseClone作为类A包含许多引用类型
  2. 我不能写一个拷贝构造函数A,因为类很大并且不断被添加到,并且包含B无法深度复制的类(如)
  3. 我无法使用序列化,因为我无法标记包含的类(例如B,没有可用的源代码)[Serializable]

我怎样才能深造课A

c# deep-copy cloning

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

方法参数可以通过引用传递对象但是只读吗?

C#:你可以这样做,以便方法参数通过引用传递一个对象但是只读吗?

例如:

void MyMethod(int x, int y, read-only MyObject obj)
Run Code Online (Sandbox Code Playgroud)

where obj是对象引用,但在方法期间无法修改此对象.

这可以用C#实现吗?

c# readonly pass-by-reference

17
推荐指数
2
解决办法
8123
查看次数

通过值或引用将对象作为参数传递给另一个类?

在C#中,我知道默认情况下,传递给函数的任何参数都是通过复制的,即在函数内,有一个参数的本地副本.但是,当一个对象作为参数传递给另一个类时呢?

是否会通过引用或值传递以下方案:

class MyClass {
   private Object localObj;

   public void SetObject(Object obj) {
      localObj = obj;
   }
}

void Main() {
   Object someTestObj = new Object();
   someTestObj.name = "My Name";
   MyClass cls = New MyClass();
   cls.SetObject(someTesetObj);
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,类变量localObj是否someTestObjMain驱动程序类中创建的副本相同?或者两个变量是否指向不同的对象实例?

c# pass-by-reference

16
推荐指数
4
解决办法
11万
查看次数

如何复制对象的实例?

我正在尝试编写一些填充a的代码List(实际上,它是一系列代码Lists,但我们可以假装它只是一个代码List).我们的想法是一种添加IPackageList了总量IPackage的顺序.请参阅以下代码:

        ParseExcel pe = new ParseExcel();
        Pinnacle p = pe.ParsePinnacleExcel();
        Rack r = new Rack(20,2,4.5,96,42,6,25*12);
        foreach (PinnacleStock ps in p.StockList.Where(x => 
                 x.ColorCode == "10" && 
                 x.PackageLength == 30.64))
        {
            for (int i = 1; i <= ps.OnOrder; i++)
            {
                r.TryAddPackage((IPackage)ps);
            }
        }
Run Code Online (Sandbox Code Playgroud)

IPackage重复添加到列表中的情况下,一切似乎都运行良好.但是,似乎正在添加对象的相同实例,即每次将对象添加到列表时都不会复制该对象.

我需要做些什么来确保 将对象副本 插入到列表中,而不仅仅是附加引用?

.net c# oop

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

如何在运行时将多次在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
查看次数