Подтвердить что ты не робот

Объект для строкового массива

Я пытаюсь преобразовать объект (объявлен здесь как "obj": object is array, primitive) в строковый массив.

объект может быть любым uint [], int16 [] и т.д.

Я пытаюсь использовать

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

Проблема возникает, когда я пытаюсь передать объект неизвестного типа в объект []. Я получаю ошибку кастинга.

Одна попытка, которую я сделал, которая не удалась, использовала

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

или

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

Я видел сообщения о типе значения и проблеме ссылочного типа при кастинге.

Будет ли простой код, который может обрабатывать кастинг для объекта [] независимо от типа объекта, если он является массивом? Я стараюсь избегать ручного управления всеми возможными типами литья.

заблаговременно

4b9b3361

Ответ 1

Вы можете использовать тот факт, что каждый массив реализует 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, если хотите.

Ответ 2

Если это всегда набор какого-то типа (массив, список и т.д.), попробуйте вернуться к простому старому 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() };
}

Ответ 3

мой пример:

   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();
    }