扩展方法不自行更新

时间:2016-02-09 14:32:48

标签: c# extension-methods

给出以下对象及其扩展名:

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;

如何让我的对象按预期更新 - 可以这样做吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

你可以用这样的构造函数创建一个新对象。

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

并打电话:

MyObj myobj = new MyObj(100,200);

答案 2 :(得分:0)

如果你想保留扩展方法,还有另一种方法:

formData.extend(staticParams);
formData.extend(localParams);

你就这样使用它

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(); 方法仅用于重置对象,那么您也可以使用构造函数。