繁体   English   中英

具有多个Setter方法的Java类的C#等效项

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM