2012-11-20 52 views
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" 
     } 
     } 
+1

'SelectedObject'不是'MyObject'类型,而是'IEnumerable '。你如何改变它的属性? –

+0

@TimSchmelter,请参阅我的编辑。 – user194076

回答

2

SelectedObject是一个对象引用。它与列表中的原始对象相同 - SelectedObject和“原始”对象是相同的对象。如果您发现有其他表示的行为,请更新您的问题。

+1

假设'MyObject'是一个类,当然... –

+0

就是这样。 :) – prprcupofcoffee

+0

我认为这里的问题是对象被分配到ViewState中,然后当它返回时,ViewState被一个新的实例恢复。 –

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的将是“垃圾”,因为引用本身改变,而且由于裁判参数,这改变了来电者也可以参考。

+编辑 但是,如果MyObject是一个结构,则在传递结构时将被复制,并将其重新分配给不同的作用域将对原始结构没有影响。

什么,你可以为这个做的是有一个函数返回的结构,并为其分配:

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

或引用参数做到这一点。