在下面的代码中,我想使用静态加载方法中的代码来刷新对象...但是如何用新对象重置当前对象?逐字段复制是唯一的方法吗?
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;
}
}
答案 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
关键字。因此,您也不能使用实例变量。