Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.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#_Arrays_Object - Fatal编程技术网

如何在c#中提取对象类型中的数组元素?

如何在c#中提取对象类型中的数组元素?,c#,arrays,object,C#,Arrays,Object,我有一个对象,它包含任何类型的数组(不是一个已知的隐修会类型。因此我不能在代码中进行简单的强制转换,因为我可以在运行时确定类型!)。如何提取数组的内容? 例如: 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

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

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?`
int[]数组=新的int[]{0,1,2};
objectobj=数组;
...
//在这里,我知道obj是一个数组(属于priori未知类型),我不能在代码中使用类型转换
//如何提取obj元素并使用它们,例如在屏幕上写入它们`

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

从编译器的角度来看,他只知道你定义了一个对象变量,在这一点上,它恰好是一个整数数组,但以后可能会变成另一个东西。毕竟,它只是一个对象

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

您可以强制转换它

var myTempArray = obj as IEnumerable;

foreach (object item in myTempArray)
   ...
编辑(再次)

如果您知道该对象是一个数组,但不知道数组的类型,则可以将其强制转换为
对象[]
。如果您只需调用
toString()
,则此操作显然有效

比如说

(obj as object[])

数组是
IEnumerable,
使用协方差
IEnumerable
。这意味着任何数组都是
IEnumerable。

int[]数组=新的int[]{0,1,2};
objectobj=数组;
IEnumerable集合=(IEnumerable)对象;
foreach(集合中的对象项)
{
Console.WriteLine(item.ToString());
}

一旦您将
数组
指定为
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];
}
objectobj;
空存储阵列(T阵列)
{
obj=阵列;
}
T GetValue(int索引)
{
收益率(T)(对象为T[])[指数];
}

注意:未测试的示例。

在.net 4.0中,您可以不必要地使用
动态
关键字

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

你是否有一个真实世界的理由来问这个问题?不知道对象的类型。例如,我想检查一个未知对象的内容。我知道如何提取它的字段。如果字段是简单的,我可以简单地使用它。但是当它是一个数组时,它是怎样的?@ AkHIR听起来好像你需要查询类型。关于要获取类型信息的对象,您可以使用
typeof
将其与已知类型进行比较,请参见下面的答案。@Adam Houldsworth:是的,但问题是我不知道类型是“int”。就像Visual Studio在不知道对象类型的情况下显示对象的内容一样。事实上,它首先确定类型,然后显示内容。@Akhir这就是为什么您在尝试使用它之前先测试类型。您知道它可能是什么类型,所以您可以测试您感兴趣的类型。如果您希望能够处理每个可能的类型,那么知道将解决什么问题可能会有帮助。我不知道开发代码时的类型是什么。我可以在运行时确定它,因此,我无法强制转换代码中的类型。@Akhir如果您知道它是数组但不知道类型,我将答案更改为“工作”。我不知道开发代码时的类型是什么。我可以请注意,
as
将接受无效的强制转换并返回一个空引用,所以在使用它之前,请检查
myTempArray
是否为空。很抱歉,我无法理解您何时使用obj(您直接使用了数组)。@akhir这是一个错误,修复了它!
dynamic object obj = array;
Console.Write(obj[0].ToString());