2010-06-03 51 views
0

有下一个任务: 我需要检查输入参数(对象)是否是数组,然后返回输入元素的数组。比如我输入数组是这样的:C#:从对象返回数组

int [] array = {1,2,3,4}; 

和方法

private object[] GetArray(object @from) 
    { 
    } 

所以,我需要在这个方法的输入变量数组并返回后,这个阵列进行检查。 检查我使用

if(@from.GetType().IsArray) 

以及如何从对象创建数组?可能吗 ? 谢谢。

回答

3

如果你想要做的是返回@fromobject[] - 如果是已经是object[] - 那么最简单的方法就是:

private object[] GetArray(object @from) 
{ 
    return @from as object[] ?? new object[] { @from }; 
} 

上面看起来样的混乱。下面是它如何工作的:

  1. 如果@from是一个object[],首先,它只是返回(类型为此类)。
  2. 其他方面,表达@from as object[]评估为null。在这种情况下,null-coalescing operator??)评估以下表达式:new object[] { @from }

所以结果是,这种方法将返回已经存在object[]阵列,或长度为1的阵列含有@from

在另一方面,如果你想填入从的@from内容的object[],我应该这样做:

private object[] GetArray(object @from) 
{ 
    var objects = @from as IEnumerable; 
    if (objects != null) 
     return objects.Cast<object>().ToArray(); 

    return new object[] { @from }; 
} 

由于LukeH指出的那样,你也可以进行检查,以确保@from不是string,如果你不想做GetArray(string)返回一个object[]char元素:

private object[] GetArray(object @from) 
{ 
    var str = @from as string; 
    if (str != null) 
     return new object[] { str }; 

    var objects = @from as IEnumerable; 
    if (objects != null) 
     return objects.Cast<object>().ToArray(); 

    return new object[] { @from }; 
} 
+0

非常感谢...... – jitm 2010-06-03 12:00:47

+0

+1,但是您也可能希望为'string'包含一个特定的检查项,因为它也实现了'IEnumerable'。 (如果你传递一个'string'到第二个版本的'GetArray',那么它会返回一个'char'数组,这可能不是我们想要的行为。) – LukeH 2010-06-03 12:05:14

+0

在做之前我会这样检查if @ from.GetType()。IsArray) – jitm 2010-06-03 12:09:55

0

你可以使用ArrayList这个任务......我们可以将任何对象添加到一个ArrayList中,你可以返回它,然后

0

不知道对象是什么,创建一个数组是一个非常模糊的任务。你想在数组中使用什么值?这些价值观是否有更深层次的意义。这些确实是对象应该了解自己的事情,并且您不一定关心详细信息。例如,Collection有一个执行此任务的CopyTo方法。