【问题标题】:Instantiate class variables in constructor of that class在该类的构造函数中实例化类变量
【发布时间】:2014-01-27 22:13:26
【问题描述】:

我有一个像这样的简单类:

public class MyClass
{
        public string String1;
        public string String2;

        public MyClass()
        {

        }

        public MyClass(string Json)
        {

        }
}

如果类在没有参数的情况下实例化,它只会带回一个空对象。但是,当我将 JSON 字符串传递给构造函数时,我想将所有属性设置为等于它们在 JSON 中的值。

我在课堂外使用 Newtonsoft 的 JSON.NET 完成了这项工作,如下所示:

string JsonArray = Base64.Decode(HttpContext.Current.Request.QueryString["songinfo"]);
MyClass tmp = JsonConvert.DeserializeObject<MyClass>(JsonArray);
MyClass InstantiatedClass = tmp;

InstantiatedClass 现在是一个完全填充的对象。但是,我想在构造函数本身中实现这一点,但我想不出一种方法来做到这一点。..

我尝试过设置this = JsonConvert.DeserializeObject&lt;MyClass&gt;(Json),但当然this 是只读的。

我知道我可以通过解析 Json 并将每个变量设置为相应的 JSON 属性值来做到这一点,但我想这样做,因为它更干净。

【问题讨论】:

  • 当然,如果MyClassstruct,那么您使用this = JsonConvert.DeserializeObject&lt;MyClass&gt;(Json); 的方法会奏效。
  • 唯一的方法是在构造函数中创建第二个实例,然后使用反射克隆所有属性。与您所要求的相比,答案中提到的静态工厂方法是下一个最好的方法,甚至是更好/更清洁的解决方案。
  • 我没有你的问题的答案,你似乎已经有了一些答案,但我想更正你的术语。您不会“实例化变量”。您可以通过创建该类型的对象来实例化一个类型。您要做的是使用作为类型实例化的对象“初始化”这些变量。

标签: c# asp.net json class self-reference


【解决方案1】:

你不能从构造函数中做到这一点。您可以考虑在MyClass 中使用工厂方法,如下所示:

public static MyClass Deserialize(string json)
{
    return JsonConvert.DeserializeObject<MyClass>(json);
}

构造函数不返回任何内容,并且正如您所说的 this 是只读的。因此,如果没有(如您所述)手动解析 JSON 并初始化该实例中的不同变量,在构造函数中执行此操作实际上是不可能的。

工厂方法可能就是你要找的。​​p>

【讨论】:

  • 注意:如果采用这种方法,可能需要将构造函数设为private,以便对象只能通过工厂方法构造。
【解决方案2】:

你可以这样做:

public class MyClass
{
    public string String1;
    public string String2;

    public MyClass()
    {

    }

    public static MyClass Instance(string json)
    {
        return new JsonConvert.DeserializeObject<MyClass>(json);
    }
}

但这只是您想要实现的某种解决方法。实际上不可能直接通过构造函数来做到这一点。

【讨论】:

    【解决方案3】:
    public MyClass(string Json)
    {
        MyClass tmp = (MyClass) JsonConvert.DeserializeObject<MyClass>(Json);
    
        this.String1 = tmp.String1;
        this.String2 = tmp.String2;
    }
    

    注意,您可以在 MyClass 方法中访问 MyClass 的所有私有成员。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-10
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多