我有两个viewState属性。
一个是List<MyObject> MyObjects
另一个是MyObject SelectedObject
每当用户从列表中选择一个对象时,我将其分配给SelectedObject,如下所示:
SelectedObject = MyObjects.Where(x=>x.MyId ==IdSelectedInUI)
这使我可以轻松操纵SelectedObject
现在,当我更改SelectedObject
的属性时,如何将这些属性分配回列表中的原始对象?我在考虑使用ref
,但无法弄明白。
修改 所有对象都是类,而不是结构 所以,这就是我所拥有的:
//Children are of type =List<MyParentObject.ChildObject>
public MyParentObject MyParent
{
get
{
if (ViewState["MyParent"] == null)
{
MyParent= GetItemsFromDatabase();
}
return (TaskInfo)ViewState["MyParent"];
}
set
{
ViewState["MyParent"] = value;
}
}
public MyParentObject.ChildObject SelectedChild
{
get
{
return (MyParentObject.ChildObject)ViewState["Child"];
}
set
{
ViewState["Child"] = value;
}
}
protected onButtonClick()
{
SelectedChild = MyParent.Children.Where(x=>x.Child_Id == Convert.ToInt32(txt.Text)).FirstOrDefault();
SelectedChild.Property2 = "test2" //OldValue "test1"
//now if I run
MyParent.Children.Where(x=>x.Child_Id ==Convert.ToInt32(txt.Text)).Select(x=>x.Property2) //Shows "test1" and I expect "test2"
}
}
答案 0 :(得分:2)
SelectedObject
是一个对象引用。它与列表中的原始对象相同 - SelectedObject
,“原始”对象是同一个对象。如果您发现其他情况,请更新您的问题。
答案 1 :(得分:0)
这取决于。假设MyObject是一个类,它是“按值”传递的,但传递的值是对原始对象的引用。
例如:
void Mutate(SomeObject x)
{
x.val = "banana";
}
void Reassign(SomeObject x)
{
x = new SomeObject();
x.val = "Garbage";
}
public static void Main()
{
SomeObject x = new SomeObject();
x.val = "Apple";
Console.WriteLine(x.val); // Prints Apple
Mutate(x);
Console.WriteLine(x.val); // Prints banana
Reassign(x);
Console.WriteLine(x.val); // Still prints banana
}
这是传递对象在C#中的工作方式。您可以修改内容,但不能修改对象本身的“值”(它是内存中指向它的指针)。
如果您想要更改对象的内容,则无需进行任何特殊操作。
通过ref参数传递对象将允许您重新分配对它的引用。例如,如果:
void Reassign(ref SomeObject x) // implementation
在上一个示例中使用过,最终WriteLine的打印输出将是“Garbage”,因为引用本身已更改,并且由于ref参数,这也改变了调用者中的引用。
+编辑 但是,如果MyObject是结构,则在传递时复制结构,并将其重新分配到不同的范围内将不会影响原始结构。
你可以做的是让一个函数返回结构并分配它:
MyStruct Mutate(MyStruct x){}
// calling
myStruct = Mutate(myStruct);
或者通过参考参数来做。