C# 等效于具有多个 Setter 方法的 Java class
C# equivalent of a Java class with multiple Setter methods
我正在尝试编写 Java class 的 C# 版本。如果我们调用我们的 class MyRequest
,我们正在处理一个名为 _body
的字段,它是一个 JSONObject
。这是我的 class 的简化版本,只有这个字段。
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
字段有三个不同的 setter 并且 class 也覆盖了 ToString()
方法。我想编写一个与此 class 等效的 C#,而不调用我的 getter 和 setter 方法 GetBody()
和 SetBody()
.
C# 中 JSONObject
的等价物是来自 Newtonsoft JSON 库的 JObject
。我写了如下覆盖(但这不是主要问题):
public override string ToString()
{
return new JObject()
{
{"Body",_body.ToString()}
}.ToString();
}
我希望 class 遵循 C# 编码标准。它们通常带有这样的模式:
private int myVar;
public int MyProperty
{
get { return myVar; }
set { myVar = value; }
}
那么我们如何才能在 C# 中对此 Java class 具有相同的行为?
C# 中的属性是唯一的。不能有两个名称相同但数据类型不同(或数据类型相同)的属性。
也就是说,除了使用方法以专门的方式设置正文之外,没有其他方法可以实现这一点。 Set...
构造在 C# 中也是一种很好的做法。只需创建一个 属性(最复杂的数据类型,如 JObject
),其余的 Set...
方法。
如果您想在 class 的初始化时设置它,一组重载的构造函数也是一个选项。 (如果需要,创建一些重载的构造函数,而不是一打)
当然,您可以创建虚拟属性来设置一个值,但我认为这是一种非常糟糕的做法。
我通常会有一个 属性,其类型与您要使用 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
,否则它的行为会很奇怪
- 使用带有基础
JObject
变量的 string
属性 最终可能会很昂贵...评估 属性 通常 预计会便宜。
我正在尝试编写 Java class 的 C# 版本。如果我们调用我们的 class MyRequest
,我们正在处理一个名为 _body
的字段,它是一个 JSONObject
。这是我的 class 的简化版本,只有这个字段。
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
字段有三个不同的 setter 并且 class 也覆盖了 ToString()
方法。我想编写一个与此 class 等效的 C#,而不调用我的 getter 和 setter 方法 GetBody()
和 SetBody()
.
C# 中 JSONObject
的等价物是来自 Newtonsoft JSON 库的 JObject
。我写了如下覆盖(但这不是主要问题):
public override string ToString()
{
return new JObject()
{
{"Body",_body.ToString()}
}.ToString();
}
我希望 class 遵循 C# 编码标准。它们通常带有这样的模式:
private int myVar;
public int MyProperty
{
get { return myVar; }
set { myVar = value; }
}
那么我们如何才能在 C# 中对此 Java class 具有相同的行为?
C# 中的属性是唯一的。不能有两个名称相同但数据类型不同(或数据类型相同)的属性。
也就是说,除了使用方法以专门的方式设置正文之外,没有其他方法可以实现这一点。 Set...
构造在 C# 中也是一种很好的做法。只需创建一个 属性(最复杂的数据类型,如 JObject
),其余的 Set...
方法。
如果您想在 class 的初始化时设置它,一组重载的构造函数也是一个选项。 (如果需要,创建一些重载的构造函数,而不是一打)
当然,您可以创建虚拟属性来设置一个值,但我认为这是一种非常糟糕的做法。
我通常会有一个 属性,其类型与您要使用 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
,否则它的行为会很奇怪 - 使用带有基础
JObject
变量的string
属性 最终可能会很昂贵...评估 属性 通常 预计会便宜。