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 属性 最终可能会很昂贵...评估 属性 通常 预计会便宜。