在该类的构造函数中实例化类变量

时间:2014-01-27 22:13:27

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

我有一个简单的类:

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

        public MyClass()
        {

        }

        public MyClass(string Json)
        {

        }
}

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

我已经使用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<MyClass>(Json)之类的内容,当然,this是只读的。

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

3 个答案:

答案 0 :(得分:4)

您无法从构造函数中执行此操作。您可以在MyClass中考虑工厂方法,如下所示:

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

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

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

答案 1 :(得分:3)

你可以这样做:

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

    public MyClass()
    {

    }

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

但这只是你想要实现的某种解决方法。事实上,没有可能通过构造函数直接执行此操作。

答案 2 :(得分:0)

public MyClass(string Json)
{
    MyClass tmp = (MyClass) JsonConvert.DeserializeObject<MyClass>(Json);

    this.String1 = tmp.String1;
    this.String2 = tmp.String2;
}

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