53

我正在尝试将一个对象(在这里声明为'obj':对象是数组,原始)转换为字符串数组。

对象可以是任何 uint[]、int16[] 等。

我一直在尝试使用

string[] str = Array.ConvertAll<object, string>((object[])obj, Convert.ToString);

当我尝试将未知类型对象转换为 object[] 时,就会出现问题。我一直收到铸造错误。

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

object[] arr = (object[])obj;

或者

IEnumerable<object> list = obj as IEnumerable<object>
object[] arr = (object[])list;

我看到有关转换的值类型和引用类型问题的帖子。

是否有一个简单的代码可以处理转换为 object[] 而不管对象的类型,只要它是一个数组?我试图避免手动处理每种可能的类型转换。

提前致谢

4

3 回答 3

82

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

string[] arr = ((IEnumerable)obj).Cast<object>()
                                 .Select(x => x.ToString())
                                 .ToArray();

这将适当地装箱原语,然后将它们转换为字符串。

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

object[] x = new string[10]; // Fine
object[] y = new int[10]; // Fails

铸造只是IEnumerable会工作。哎呀,如果你愿意,你可以投到Array

于 2012-05-24T21:30:17.983 回答
16

如果它始终是某种类型(数组、列表等)的集合,那么请尝试转换回普通的旧版本System.Collections.IEnumerable并从那里开始

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

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

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() };
}
于 2012-05-24T21:31:04.667 回答
-2

我的例子:

   public class TestObject
    {
        public string Property1 { get; set; }

        public string Property2 { get; set; }

        public string Property3 { get; set; }
    }



    static void Main(string[] args)
    {
        List<TestObject> testObjectList = new List<TestObject>
        {
            new TestObject() { Property1 = "1", Property2 = "2", Property3 = "3" },
            new TestObject() { Property1 = "1", Property2 = "2", Property3 = "3" },
            new TestObject() { Property1 = "1", Property2 = "2", Property3 = "3" }
        };

        List<string[]> convertedTestObjectList = testObjectList.Select(x => new string[] { x.Property1, x.Property2, x.Property3 }).ToList();
    }
于 2016-08-31T09:09:57.017 回答