0

我有两个 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"
        }
        }
4

2 回答 2

2

SelectedObject是一个对象引用。它与列表中的原始对象相同 -SelectedObject并且“原始”对象是同一个对象。如果您看到的行为表明并非如此,请更新您的问题。

于 2012-11-20T22:54:32.570 回答
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 的打印输出将是“垃圾”,因为引用本身已更改,并且由于 ref 参数,这也更改了调用者中的引用。

+Edit 如果 MyObject 是一个结构,但是,该结构在传递时会被复制,并且在不同的范围内重新分配它不会对原始结构产生影响。

你可以做的是让一个函数返回结构并分配它:

MyStruct Mutate(MyStruct x){}
// calling
myStruct = Mutate(myStruct);

或者通过引用参数来做。

于 2012-11-20T23:08:07.167 回答