Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检查变量是数组还是对象?_C#_Json_Windows Phone 7_C# 4.0 - Fatal编程技术网

C# 如何检查变量是数组还是对象?

C# 如何检查变量是数组还是对象?,c#,json,windows-phone-7,c#-4.0,C#,Json,Windows Phone 7,C# 4.0,为了反序列化json对象,我必须定义一个父类,该父类将包含子类的对象或对象数组。如果检索到一个对象,则它必须是一个对象;如果从json检索到一个数组,则它必须是一个对象数组 JSON数组对象 {"y":{"x":[{"data":28}, {"data":56}, {"data":89}]}} JSON对象 {"y":{"x":{"data":28}}} y一次接收x,x[]另一次接收。没有这样的条件来确定y是否接收数组或对象 因此,为了确定是否接收到数组,我检查IsArray()条件 我试

为了反序列化json对象,我必须定义一个父类,该父类将包含子类的对象或对象数组。如果检索到一个对象,则它必须是一个对象;如果从json检索到一个数组,则它必须是一个对象数组

JSON数组对象

{"y":{"x":[{"data":28}, {"data":56}, {"data":89}]}}
JSON对象

{"y":{"x":{"data":28}}}
y一次接收x,x[]另一次接收。没有这样的条件来确定y是否接收数组或对象

因此,为了确定是否接收到数组,我检查IsArray()条件

我试过了

class Y
{
   public X x { get { return System.IsArray() ? new X() : new x[] }; set; }
}

class X
{
   public int data { get; set; }
}
  • 它不起作用了
  • System.IsArray()未被识别

  • 类Y中x类型的属性x不能是x的数组,如果您明确声明它是x类型的。将其声明为对象将是解决此问题的一种方法

    如果您想检查它是否是一个数组,我会使用一个支持字段(比如x),然后在使用属性的地方进行检查(
    typeof(x)==x[]

    但这可能会变得混乱,我最好的建议是将属性x的类型设置为x[],并在集合中确定值是否是数组(如果是,则只设置
    \u x=value
    ),或者如果不向x的空数组添加值首先,数组是一个对象。这是一件好事,因为它允许这些函数工作(都假设
    使用System;
    ):

    其次,如果希望属性的类型可以是
    X
    X[]
    ,则属性的类型必须是
    对象

    class Y             
    {
       private object _x;
       public object x {
           get { return _x; }
           set
           {
               if (value.GetType != typeof(X) && value.GetType != typeof(X[]))
                   throw new ArgumentException("value");
               _x = value;
           }
       }
    }
    
    这在某种程度上忽略了静态类型的优点,因为您正在使用
    object
    并在运行时检查类型。将属性定义为数组实际上要简单得多,即使对于只有一个值的情况也是如此。在这种情况下,它将是一个长度为1的数组。

    我一直在使用Nuget软件包,使用起来非常简单:

      string jsonStr = "{'y':{'x':[{'data':28}, {'data':56}, {'data':89}]}}";
      dynamic jobject = JsonConvert.DeserializeObject(jsonStr);
    
      bool isArray  = jobject.y.x.Type == JTokenType.Array;
      bool isObject = jobject.y.x.Type == JTokenType.Object;
    
    希望这有帮助

    你可以试试这个

    if (obj.GetType().IsArray)
    {
      ...
    }
    
    另一种方法是

    if (obj is Array) {
       ...
    }
    

    您可以控制生成JSON的逻辑吗?如果是这样,你应该考虑重新设计数据对象遵循一个标准合同。拥有一个有时是单个对象,有时是数组的属性是一个糟糕的设计,从长远来看是有问题的。如果你有能力,你应该考虑把它做成一个数组,并建立你的对象模型来解释这个问题。检查
    类型
    。您应该在您感兴趣的对象上进行检查,而不是在
    系统上进行检查。
    
    if (obj is Array) {
       ...
    }