假设我有一个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) 我正在从父对象创建一个子对象.所以场景是我有一个对象和一个子对象,它为我想要搜索的场景添加了一个距离属性.我选择使用继承,因为我的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)
}
我一直在为项目创建对象,有些实例我必须为这些对象创建一个深层副本我已经想到了使用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) 要将属性值从一个对象复制到另一个对象,我们通常使用以下语法实现:
ca.pro1 = cb.pro2;
ca.pro2 = cb.pro2;
Run Code Online (Sandbox Code Playgroud)
其中ca和cb属于同一类.
有没有更简单的synatx或实用方法来帮助我们达到同样的效果?
谢谢.
我遇到过这段代码:
var rectangle = new Rectangle(420, 69);
var newOne = rectangle with { Width = 420 }
Run Code Online (Sandbox Code Playgroud)
我想知道withC# 代码中的关键字。它是做什么用的?以及如何使用它?它给语言带来了什么好处?
鉴于以下课程:
class A
{
public List<B> ListB;
// etc...
}
Run Code Online (Sandbox Code Playgroud)
哪个B是可以继承/包含其他类的另一个类.
鉴于这种情况:
A 是一个大类,包含许多引用类型B,[Serializable]因为我无法访问源代码B以下执行深度复制的方法不起作用:
ICloneable或MemberwiseClone作为类A包含许多引用类型A,因为类很大并且不断被添加到,并且包含B无法深度复制的类(如)B,没有可用的源代码)[Serializable]我怎样才能深造课A?
C#:你可以这样做,以便方法参数通过引用传递一个对象但是只读吗?
例如:
void MyMethod(int x, int y, read-only MyObject obj)
Run Code Online (Sandbox Code Playgroud)
where obj是对象引用,但在方法期间无法修改此对象.
这可以用C#实现吗?
在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是否someTestObj与Main驱动程序类中创建的副本相同?或者两个变量是否指向不同的对象实例?
我正在尝试编写一些填充a的代码List(实际上,它是一系列代码Lists,但我们可以假装它只是一个代码List).我们的想法是一种添加IPackage到List了总量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重复添加到列表中的情况下,一切似乎都运行良好.但是,似乎正在添加对象的相同实例,即每次将对象添加到列表时都不会复制该对象.
我需要做些什么来确保 将对象的副本 插入到列表中,而不仅仅是附加引用?
我在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)