使用新对象重置此项

时间:2010-11-09 07:57:14

标签: c# .net

在下面的代码中,我想使用静态加载方法中的代码来刷新对象...但是如何用新对象重置当前对象?逐字段复制是唯一的方法吗?

class WIP
{
    //  <Snipped> Various other properties...
    public Boolean Refresh()
    {
        //  Need to change the current object with the updated object
        this = WIP.Load(this.ObjectID);  // Says this is readonly...
        return true;
    }

    public static WIP Load(long ObjectID)
    {
        //  This static method fetches the data from DB and returns the object.
    }
}

编辑:我在发布问题后得到了这个想法......这里有陷阱吗?

class WIP
{
    //  <Snipped> Various other properties... 
    public Boolean Refresh()
    {
        //  This method fetches the data from DB and updates the object. 
    }

    public static WIP Load(long ObjectID)
    {
        WIP newObject = new WIP();
        newObject.ObjectID = ObjectID;
        newObject.Refresh();
        return newObject;
    }
} 

5 个答案:

答案 0 :(得分:1)

不,你不能。你最接近的基本上是复制每个成员 - 当然,如果有些成员是只读的,那就无法发挥作用。

要么你试图使你的对象不可变 - 在这种情况下,不应该在已经引用你的对象的代码的脚下改变 - 或者你不是,在哪种情况下你只需要使它完全可变(理想情况下,如果涉及多个线程,则以某种原子方式)。

答案 1 :(得分:1)

听起来你需要“WIP工厂”:

class WIP
{
    private static Dictionary<long, WIP> instances = new Dictionary<long, WIP>();
    private WIP()
    {
        ...
    }


    //  <Snipped> Various other properties... 
    public Boolean Refresh()
    {
        //  This method fetches the data from DB and updates the object. 
    }

    public static WIP Load(long ObjectID)
    {
        WIP wip = null;
        if (instances.ContainsKey(ObjectID))
        {
            wip = instances[ObjectID];
        }
        else
        {
            wip = new WIP();
            wip.ObjectID = ObjectID;
            instances.Add(ObjectID, wip);
        }
        wip.Refresh();

        return wip;
    }
}

这将导致获取WIP实例的唯一方法是通过静态“加载”方法,并且您将为每个ObjectID使用相同的实例,这与您允许任何人为同一ID创建新实例的当前代码不同。

这样调用Refresh将更新所有实例,无论它们在何处。

答案 2 :(得分:0)

你不能。

只要认为应该更新包含您尝试“刷新”的对象的引用的所有其他对象。您只有添加间接级别或更改软件设计的机会。

答案 3 :(得分:0)

Static方法表明它是一种“工厂式”实现。因此应该用于创建或获取对象的新实例。

另一方面的Refresh方法可以自然地用于刷新当前对象的属性并保持对象引用不变。

用法:

// Initialize the object
WIP myWip = WIP.Load(1);
Console.WriteLine(myWip.ObjectId);
// Refresh the object from underlying data store
myWip.Refresh();


//  <Snipped> Various other properties... 
public Boolean Refresh() 
{ 
    //Read the values from data store and refresh the properties...        
    return true; 
} 

public static WIP Load(long ObjectID) 
{ 
    //  This static method fetches the data from DB and returns the object. 
} 

对于对象的生命周期管理,我会使用一些工厂。你可以看一下工厂模式 - &gt; http://en.wikipedia.org/wiki/Factory_method_pattern

答案 4 :(得分:-1)

您不能在静态方法中使用this关键字。因此,您也不能使用实例变量。