使用您定义的属性,您不需要进行任何复制,就像您拥有的一样。我不确定ChangeSomething()是什么,但你应该可以直接在属性上调用它。我通常会拔不出来作为一个对象......这已经有一段时间,因为我做了纯粹的web表单的发展,但我的ViewState的帮手属性通常看起来更像是:
public string CurrentUsername
{
get
{
if (ViewState["Username"] is string)
return (string)ViewState["Username"];
return null;
}
set { ViewState["Username"] = value; }
}
编辑:关于它的思考,我猜复制可能只是为了在每次引用属性时删除潜在的性能开销。我不认为这是在大多数情况下,一个有效的优化,但是如果你感到强烈的话,你可以像这样的东西隐藏:
private string m_CurrentUsername;
public string CurrentUsername
{
get
{
if (m_CurrentUsername == null && ViewState["Username"] is string)
m_CurrentUsername = (string)ViewState["Username"];
return m_CurrentUsername;
}
set { ViewState["Username"] = m_CurrentUsername = value; }
}
就像我,虽然说 - 我不会推荐。
我认为你是过分分析我的问题,我并不关心投射开销,我只是想举一个简单的例子。问题是,如果ChangeSomething()返回一个对象,我可以写MyObject = MyObject.ChangeSomething();这很好,但如果ChangeSomething()返回void并修改实例变量,则不能直接使用MyObject.ChangeSomething()修改视图状态,只要该属性包装了普通实例变量即可。至少这是我在尝试时看到的。我认为这是与被序列化的底层对象有关。 – fearofawhackplanet 2009-12-03 18:32:29