[英]C# equivalent of a Java class with multiple Setter methods
我正在尝试编写Java类的C#版本。 如果我们调用类MyRequest
,我们面对的是一个域名为_body
这是一个JSONObject
。 这是我的课程的简化版本,仅包含此字段。
Java的:
public class MyRequest {
JSONObject _body = new JSONObject();
/**
* Pass a String formatted json as the request body
* @param json
* @return the request itself
*/
public MyRequest setBody(String json) {
_body = new JSONObject(json);
return this;
}
/**
* Pass a JSONObject formatted json as the request body
* @param json
* @return the request itself
*/
public MyRequest setBody(JSONObject json) {
return setBody(json.toString());
}
/**
* Use an HashMap to build the body
* @param json
* @return the request itself
*/
public MyRequest setBody(HashMap<String, Object> json) {
_body = new JSONObject(json);
return this;
}
/**
* Body getter
* @return the stringified body
*/
public String getBody() {
return _body.toString();
}
@Override
public String toString() {
return new JSONObject()
.put("Resource", _resource)
.put("ID", _id)
.put("Action", _action)
.put("Action ID", _actionId)
.put("Filters", _filters.toString())
.put("Body", _body.toString())
.toString();
}
}
如我们所见, _body
字段具有三个不同的设置方法,并且该类还覆盖了ToString()
方法。 我想编写一个与此类等效的C#而不调用我的getter和setter方法GetBody()
和SetBody()
。
在C#中,等效于JSONObject
将是来自Newtonsoft JSON库的JObject
。 我已经将重写写成如下(但这不是主要问题):
public override string ToString()
{
return new JObject()
{
{"Body",_body.ToString()}
}.ToString();
}
我希望该类遵循C#编码标准。 它们通常带有以下模式:
private int myVar;
public int MyProperty
{
get { return myVar; }
set { myVar = value; }
}
那么,我们如何在C#中对此Java类具有相同的行为呢?
通常,我将具有与您要使用getter公开的类型相同的属性,然后具有其他SetBody
方法。 因此可能 :
private JObject body;
public string Body
{
get { return body.ToString(); }
set { body = JObject.Parse(value); }
}
public void SetBody(JObject body)
{
this.body = body;
}
public void SetBody(IDictionary<string, object> body)
{
...
}
然而:
SetBody(JObject)
方法中克隆JObject
,否则它将表现得很奇怪 string
属性与基础JObject
变量一起使用可能JObject
昂贵…… 通常,对属性进行评估通常很便宜。 C#中的属性是唯一的。 您不能有两个具有相同名称和不同数据类型(或相同数据类型)的属性。
也就是说,除了使用专门的方法设置主体之外,没有其他方法可以实现此目的。 Set...
构造也是C#中的一个好习惯。 只需创建一个属性(最复杂的数据类型,如JObject
),然后创建Set...
方法即可。
如果要在类的初始化时进行设置,则也可以选择使用一组重载的构造函数。 (如果需要,请创建一些重载的构造函数,而不是一堆)
当然,您可以创建虚拟属性来设置值,但是我认为这是非常糟糕的做法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.