【问题标题】:How to extract elements of an array in object type in c#?如何在c#中提取对象类型的数组元素?
【发布时间】:2011-10-29 18:38:35
【问题描述】:

我有一个对象,其中包含 任何类型的数组(不是先验已知的类型。所以我不能在代码中进行简单的转换,因为我可以在运行时确定类型!)。如何提取数组的内容? 例如:

int[] array = new int[] { 0, 1, 2 };
object obj=array;
...
//Here I know that obj is an array (<b>of a priory unknown type and I cannot use type conversion in the code </b> 
//How can extract elements of obj and use them, e.g. write them on the screen?`

【问题讨论】:

  • 你问这个问题有真实的理由吗?
  • 未知的对象类型。例如,考虑我要检查未知对象的内容。我知道如何提取它的领域。如果该领域是一个简单的领域,我可以简单地使用它。但是当它是一个数组的时候呢?
  • @Akhir 听起来您需要查询类型。在对象上调用.GetType() 以获取类型信息,然后您可以使用typeof 将其与已知类型进行比较,请参阅下面的答案。
  • @Adam Houldsworth:是的,但问题是我不知道类型是“int”。就像 Visual Studio 向您显示对象的内容时不知道其类型的先验一样。事实上,它首先确定类型,然后显示内容。
  • @Akhir 这就是为什么你在尝试使用它之前测试类型。您知道它可能是什么类型,因此您可以测试您感兴趣的类型。如果您希望能够处理所有可能的类型,那么了解将解决什么问题可能会有所帮助。

标签: c# arrays object


【解决方案1】:

您需要将其转换回 int[] 然后提取元素。毕竟,您知道这是一个整数数组这一事实并不能反映您说这是一个对象的事实。

从编译器的角度来看。他所知道的是,您已经定义了一个对象变量,此时它恰好是一个整数数组,但稍后可能会更改为另一件事......毕竟只是一个对象。

当您进行强制转换时,运行时会执行约束检查,因此,从逻辑上讲,编译器不会让您仅将其用作数组,而是要求您首先将其强制转换为数组。

【讨论】:

    【解决方案2】:

    你可以施放它。

    var myTempArray = obj as IEnumerable;
    
    foreach (object item in myTempArray)
       ...
    

    【讨论】:

    • 开发代码的时候不知道是什么类型。我可以在运行时确定它,所以我不能在代码中转换类型。
    • @akhir 注意as 会吞下无效的强制转换并返回一个空引用,所以在使用它之前检查myTempArray 是否为空。
    【解决方案3】:

    编辑(再次)

    如果您知道该对象是一个数组并且您不知道该数组的类型,您可以将其转换为object[]。如果您只需致电toString(),这将绝对有效。

    例如

    (obj as object[])
    

    【讨论】:

    • 开发代码的时候不知道是什么类型。我可以在运行时确定它,所以我不能在代码中转换类型。
    • @Akhir 如果您知道它是一个数组但不知道类型,我将答案更改为有效。
    【解决方案4】:

    数组是使用协方差的IEnumerable&lt;T&gt;,IEnumerable&lt;object&gt;。这意味着 any 数组是 IEnumerable&lt;object&gt;.

    int[] array = new int[] { 0, 1, 2 };
    object obj=array;
    IEnumerable<object> collection = (IEnumerable<object>)obj;
    
    foreach (object item in collection)
    {
        Console.WriteLine(item.ToString());
    }
    

    【讨论】:

    • 对不起,我不明白你什么时候使用 obj (你直接使用数组)。
    • @Akhir 这是一个错字,已修复!
    【解决方案5】:

    一旦您将array 指定为obj,您就进行了一次转换。您必须通过再次投射来检索项目:

    int[] array = new int[] { 0, 1, 2 };
    object obj = array;
    
    var i = ((int[])obj)[0];
    

    如果你不知道数组的类型,你将不得不使用泛型:

    object obj;
    
    void StoreArray<T>(T array)
    {
        obj = array;
    }
    
    T GetValue<T>(int index)
    {
        return (T)(obj as T[])[index];
    }
    

    注意:未经测试的样本。

    【讨论】:

      【解决方案6】:

      在 .net 4.0 中,您可能会不必要地使用 dynamic 关键字,

      dynamic object obj = array;
      Console.Write(obj[0].ToString());
      

      【讨论】:

        猜你喜欢
        • 2019-11-17
        • 1970-01-01
        • 1970-01-01
        • 2019-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-21
        相关资源
        最近更新 更多