我有一个对象的List(在C#中)(我创建的类).我能够使用列表,但问题是我只创建(实例化我认为是正确的术语)我的一个对象类,并且我继续将它添加到列表中,即使该对象的属性随着代码的迭代而改变.我希望能够将硬编码对象添加到我的列表而不是参考对象.
这是我目前正在做的事情:
public class SaveData
{
public double save_property1;
public double save_property2;
}
in the application
SaveData newSaveData = new SaveData();
List<SaveData> newSaveDataList = new List<SaveData>;
if ( some condition)
{
newSaveData.save_property1 = x
}
if (some condition 2)
{
newSaveData.save_property2 = y
newSaveDataList.Add(SaveData); //
}
Run Code Online (Sandbox Code Playgroud)
由于X和Y在迭代中发生变化,我希望SaveDate我添加到列表中的对象不会随着每次迭代而改变(因此我可以保留Data对象的历史记录),即硬编码而不是用作参考.
我在c#中工作,有几个工作区有一个特定的类,在每个工作区中它总是相同的.我希望能够拥有此类的副本,以便能够使用它而无需处理命名空间差异.例如:
namespace1 {
class class1{
public class2;
}
class class2{
public string;
}
}
namespace2 {
class class1{
public class2;
}
class class2{
public string;
}
}
Run Code Online (Sandbox Code Playgroud)
在我复制的类中,我有一个函数将所有数据复制到命名空间的类之一.如果我只有c#标准类型,它会工作.一旦我处理class2对象(也来自不同的命名空间),我得到了exeption("对象与目标类型不匹配.")
public Object toNamespaceClass(Object namespaceClass)
{
try
{
Type fromType = this.GetType();
Type toType = namespaceClass.GetType();
PropertyInfo[] fromProps = fromType.GetProperties();
PropertyInfo[] toProps = toType.GetProperties();
for (int i = 0; i < fromProps.Length; i++)
{
PropertyInfo fromProp = fromProps[i];
PropertyInfo toProp = toType.GetProperty(fromProp.Name);
if (toProp != null)
{
toProp.SetValue(this, fromProp.GetValue(namespaceClass, null), null);
}
} …Run Code Online (Sandbox Code Playgroud) 例如
class School
{
public List<Student> Students {get; private set;}
}
Run Code Online (Sandbox Code Playgroud)
这School不是不可变的,因为getter Students是一个可变的集合.如何使类不可变?
public void MethodSample1(Itest variable)
{
variable.TestString = "some sample data";
Itest var1 = variable;
Console.WriteLine(variable.TestString);
MethodSample2(variable);
Console.WriteLine(variable.TestString);
Console.WriteLine(var1.TestString);
}
public void MethodSample2(Itest variable)
{
variable.TestString = "testdata";
}
public interface Itest
{
string TestString { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
预计两个控制台输出行都打印"一些样本数据",但似乎TestString是被新值覆盖了?是不是"默认情况下在C#中所有的值都按值传递?".
总之,如何保存"TestString"的值MethodSample1?
(我遇到了这个问题,因为我的所有项目都基于单个界面)
即使保留了价值,它确实反映了!奇怪!
在开始之前,我知道还有其他几个问题可以"回答"这个问题,但不是我能够理解的方式.这就是我所指的: C#中的深度复制
我做了一些研究,我希望有人可以向我解释如何将对象设置为另一个对象的值.
例如,让我们说:
myObject bob;
bob = new myObject();
myObject joe
joe = bob
Run Code Online (Sandbox Code Playgroud)
从我可以研究的,joe现在指向鲍勃的实例bob.这些物体是否仍然独立运作?
我如何创建两个对象,将一个对象的内容复制到另一个对象,并将它们作为两个单独的对象,其字段,方法和事件分别发生?
我很抱歉再次提出这个问题,但我似乎找不到其他地方对我有意义的解释.
参考与使用扩展方法为类创建深层复制方法相关的堆栈溢出讨论,该方法不需要[Serializable]属性:
我拥有的类是一个单例类,它是一个旧的实现:
我是否可以创建相同的深层副本,我理解这是不可能的,但试图理解,如果在这种典型场景中有可能的解决方法.我知道对我来说其他选择是将类更改为非单例,但在我们当前的设计和用法中,这将是很多工作并且可能导致许多问题.
此外,当前类还有多个其他自定义类被引用,因此当我要进行深层复制时,尤其是Alex Burtsev在以下代码中的方式:
https://raw.github.com/Burtsev-Alexey/net-object-deep-copy/master/ObjectExtensions.cs
我是否需要为所有被引用的类提供扩展方法,我假设情况就是如此.
我必须复制一个字典,使用该副本并返回原始字典.
似乎发生的事情是,当我对复制的字典做一些工作时,修改了orignal字典.
这是我的代码:
dmodified_profile = new SortedDictionary<int,SortedDictionary<string,List<string>>>(d_profile);
Run Code Online (Sandbox Code Playgroud)
我不知道为什么如果我在dmodified_profile字典上进行修改,可以修改原始的d_profile?
谢谢
我在windows phone 8中写了一段代码(c#)(与windows 8有同样的问题).
我想知道,如何过去一个对象的价值,而不是他的参考.
让我解释一个例子:
public MyClass
{
private Foo foo //my object.
public void Init()
{
foo = new Foo();
foo.age = 5;
ChangeFooValue(foo);
}
private void ChangeFooValue(Foo temp)
{
temp.age = 10;
//I want to change temp and NOT foo.
//But at the end of this
//foo.age = 10;
//and
//temp.age = 10;
}
}
Run Code Online (Sandbox Code Playgroud)
解决了: 我在课堂上创建了一个深层副本:
public Foo DeepCopy()
{
Foo other = (Foo) this.MemberwiseClone();
return other;
}
Run Code Online (Sandbox Code Playgroud)
ps:这可能是一个愚蠢的问题(如果是的话,请给我一些教程,以便能够通过我自己解决它).
这可能是一个简单的问题,我对OOP一般都是新手.
如果我有一个带有一个int数组属性的简单类(和构造函数)
public class MyClass
{
public int[] MyProperty {get; set;}
public MyClass(){}
}
Run Code Online (Sandbox Code Playgroud)
如果对象没有更改属性,如何将属性值设置为对象的值?
MyClass C1 = new MyClass();
MYClass C2 = new MyClass();
int[] x = new int[3] {1,2,3};
C1.MyProperty = x;
x[2] = 7; //this changes C1.MyProperty to a value of {1,2,7}
C2.MyProperty = x;
Run Code Online (Sandbox Code Playgroud)
我希望C1的属性的2索引保持值3,即使我改变x [2]的值.类似地,我希望C2属性索引2值始终为7.是否有某种方式我可以将属性设置为ValueOf(x)?我需要某种静态关键字吗?
我有两个班级Product和ExtendedProduct. ExtendedProduct派生自Product类。ExtendedProduct课堂上还有一些字段。
问题是,当我投射ExtendedProduct到Product我的Product对象中有字段时ExtendedProduct。
我只想转换ExtendedProduct为Product班级,而班级中不ExtendedProduct出现任何班级字段Product。
c# ×10
.net ×5
copy ×2
.net-4.0 ×1
asp.net ×1
asp.net-mvc ×1
class ×1
deep-copy ×1
dictionary ×1
immutability ×1
object ×1
properties ×1
reflection ×1
setter ×1
windows-8 ×1