- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为工作中的 REST API(这是一个带有静态方法的静态类)编写一个包装器,它应该返回一个类或一个结构,其中包含从 API 请求返回的所有已解析的 Json。我正在使用 System.Web.Script.Serialization
解析 Json,如下所示:
JavaScriptSerializer jss = new JavaScriptSerializer();
QueryResult re = jss.Deserialize<QueryResult>(json);
然后我想在 QueryResult 上设置两个附加参数:使用的原始请求 Url 和 API 返回的确切 Json。一个矛盾是我希望整个对象只在从 API 包装器返回后才被读取。我的第一个想法是只让变量通过构造函数设置,但解析 Json 的方式永远不会让我使用构造函数。我考虑过有两个非常相似的对象,即一个在用于解析的包装器之外看不到的私有(private)类,然后是一个使用构造函数一次设置只读参数的公共(public)类,但这非常多余的,我宁愿用任何其他方式来做。
他们有什么设计模式或技巧可以让我这样做吗?我希望他们尝试分配给其中一个属性是一个语法错误,而不仅仅是一个被忽略的分配。
最佳答案
更新:
What I'm looking for is a way to be able to edit an object and then lock it down so that every field is read only after a particular line of code.
这听起来像是构建器模式的合适用例。你有一个可变对象,你可以用它来设置你想要构建的任何东西的状态;然后此类型负责构造实际可用的不可变(“锁定”)类型的实例。
例如:
public class QueryResultBuilder
{
private string _requestUrl;
// plus other fields
public QueryResultBuilder SetRequestUrl(string requestUrl)
{
_requestUrl = requestUrl;
return this;
}
// plus other methods
public QueryResult Build()
{
// This could be an internal constructor,
// only used by this builder type.
return new QueryResult(_requestUrl /* plus other parameters *);
}
}
然后您的调用代码可能如下所示:
JavaScriptSerializer jss = new JavaScriptSerializer();
QueryResult re = jss.Deserialize<QueryResultBuilder>(json)
.SetRequestUrl("url")
.Build();
老实说,我不知道这是否适合您的场景,但是“可以‘更新’的只读对象”问题的一个常见解决方案是使用一个返回副本<的不可变类型/em> 进行了修改(例如,很像 DateTime.Add
)。
所以你可以有这样的操作......
class QueryResult
{
// ...lots of other stuff...
public QueryResult SetRequestUrl(string requestUrl)
{
QueryResult clone = this.Clone();
// This property could have a private setter.
clone.RequestUrl = requestUrl;
return clone;
}
}
然后调用代码需要做类似的事情:
JavaScriptSerializer jss = new JavaScriptSerializer();
QueryResult re = jss.Deserialize<QueryResult>(json).SetRequestUrl("url");
关于c# - 使 "Read Only"对象从 API 包装器返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5993842/
我是一名优秀的程序员,十分优秀!