gpt4 book ai didi

c# - 使 "Read Only"对象从 API 包装器返回?

转载 作者:行者123 更新时间:2023-11-30 22:38:45 26 4
gpt4 key购买 nike

我正在为工作中的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com