2016-02-09 2 views
0

Учитывая следующий объект и его расширение:метод расширения не обновляя себя

public class MyObj 
{ 
    string var1 = "100"; 
    string var2 = "200"; 
} 

public static void DoSomething(this MyObj myobj) 
{ 
    myobj = new MyObj() 
    myobj.var1 = "100000"; 
    myobj.var2 = "200000"; 
} 

Примечание метод расширения создает новый экземпляр и присваивает его себе. Однако, когда я это делаю, мой объект фактически не обновляется, как ожидалось. Он по-прежнему содержит старые значения переменных и остается нетронутым.

MyObj myobj = new MyObj(); 
myobj.DoSomething(); 

//myobj.var1 is still 100, but expected it to be 100000; 
//myobj.var1 is still 200, but expected it to be 200000; 

Как получить объект для обновления, как ожидалось, - это можно сделать?

+0

Пожалуйста, объясните голосующий голос. – MarzSocks

+0

Код, который вы отправили, даже не компилируется. Представьте пример, который может реально воспроизвести описанную вами проблему. – Servy

+0

Thats, потому что его код psedo? ясно, что принц был достаточно хорош, чтобы все могли понять этот вопрос. – MarzSocks

ответ

5

Вы не можете назначить другой экземпляр себе из метода расширения. Вы просто меняете ссылку на локальную переменную myobj.

Вы можете сделать это из статического метода с ref:

public static void DoSomething(ref MyObj myobj) 
{ 
    myobj = new MyObj() 
    myobj.var1 = 100000; 
    myobj.var2 = 200000; 
} 

Использование:

MyObj myobj = null; 
DoSomething(ref myobj); 
// myobj is set here 
+0

спасибо за ответ. Вы получаете ответ, потому что объяснили, что «вы не можете назначить другой экземпляр себе».Я до сих пор не понимаю, почему еще, но достаточно знаний, чтобы использовать другие подходы. :) – MarzSocks

+0

Читайте в [область переменной] (https://msdn.microsoft.com/en-us/library/aa691132 (v = vs.71) .aspx). –

+0

Спасибо, о, пожалуйста, подумайте о том, чтобы выставить меня противником, если вы считаете, что вопрос достаточно закончен. – MarzSocks

1

Вы можете просто создать новый объект с помощью конструктора, как это.

MyObj(int x, int y) 
{ 
    var1 = x; 
    var2 = y; 
} 

и называют как:

MyObj myobj = new MyObj(100,200); 
+0

@PatrickHofman Вот почему этот ответ предполагает, что он не использует метод расширения; это предполагает, что он использует конструктор, что почти наверняка следует использовать * для такой ситуации. – Servy

+0

Ах, мой плохой, потому что у него был мозговой пердит и он не читал часть «расширения». Будет удаляться, так как ваш ответ правильный, и нет необходимости в двойных копиях ответов. – Jacobr365

+0

Хорошо, если это ответ, я в порядке с ним @Servy –

0

Другой способ пойти, если вы хотите сохранить метод расширения:

public static MyObj DoSomething(this MyObj myobj) 
{ 
    myobj = new MyObj() 
    myobj.var1 = "100000"; 
    myobj.var2 = "200000"; 

    return myobj; 
} 

И использовать его как так

MyObj myobj = new MyObj(); 
myobj = myobj.DoSomething(); 

Обратите внимание, что если вашМетодиспользуется только для сброса объекта, вы также можете использовать конструктор.

 Смежные вопросы

  • Нет связанных вопросов^_^