对象到字符串数组

swc*_*aft 46 c# c#-3.0 c#-4.0

我试图将一个对象(这里声明为'obj':object is array,primitive)转换为字符串数组.

对象可以是任何uint [],int16 []等.

我一直在尝试使用

string[] str = Array.ConvertAll<object, string>((object[])obj, Convert.ToString);
Run Code Online (Sandbox Code Playgroud)

当我尝试将未知类型对象转换为object []时,会出现问题.我一直在犯错误.

我做的一次尝试失败了,正在使用

object[] arr = (object[])obj;
Run Code Online (Sandbox Code Playgroud)

要么

IEnumerable<object> list = obj as IEnumerable<object>
object[] arr = (object[])list;
Run Code Online (Sandbox Code Playgroud)

我在转换时看到了有关值类型和引用类型问题的帖子.

是否有一个简单的代码可以处理对象[]的转换,无论对象的类型如何,只要它是一个数组?我试图避免手动处理每种可能的类型铸件.

提前致谢

Jon*_*eet 74

您可以使用每个数组实现的事实IEnumerable:

string[] arr = ((IEnumerable)obj).Cast<object>()
                                 .Select(x => x.ToString())
                                 .ToArray();
Run Code Online (Sandbox Code Playgroud)

在将它们转换为字符串之前,这将适当地封装基元.

转换失败的原因是虽然引用类型的数组是协变的,但类型的数组不是:

object[] x = new string[10]; // Fine
object[] y = new int[10]; // Fails
Run Code Online (Sandbox Code Playgroud)

IEnumerable尽管如此,施法才会奏效.哎呀,Array如果你愿意,你可以施展.

  • @Tigran:如果`obj`被声明为`object`,那就不行了,这就是我读这个问题的方式. (3认同)

Jar*_*Par 12

如果它总是某种类型的集合(数组,列表等等),那么请尝试回到原来的旧版本System.Collections.IEnumerable并从那里开始

string[] str = ((System.Collections.IEnumerable)obj)
  .Cast<object>()
  .Select(x => x.ToString())
  .ToArray();
Run Code Online (Sandbox Code Playgroud)

这是一个更彻底的实现,也可以处理非集合

static string[] ToStringArray(object arg) {
  var collection = arg as System.Collections.IEnumerable;
  if (collection != null) {
    return collection
      .Cast<object>()
      .Select(x => x.ToString())
      .ToArray();
  }

  if (arg == null) {
    return new string[] { };
  }

  return new string[] { arg.ToString() };
}
Run Code Online (Sandbox Code Playgroud)