Обновление
То, что я ищу, это способ быть
возможность редактировать объект, а затем заблокировать
это так, что каждое поле читается
только после определенной строки кода.
Это звучит как подходящий вариант использования для шаблона построения. У вас есть изменяемый объект, который вы можете использовать просто для установки состояния того, что вы хотите построить; тогда этот тип отвечает за создание экземпляра неизменяемого («заблокированного») типа, который действительно может использоваться.
Например:
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();
Я, честно говоря, понятия не имею, является ли это подходящим ответом для вашего сценария, но одно общее решение проблемы «объект только для чтения, который может быть« обновлен »» состоит в том, чтобы иметь неизменный тип, который возвращает копии с изменениями (например, 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");