Объект для строкового массива
Я пытаюсь преобразовать объект (объявлен здесь как "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;
Я видел сообщения о типе значения и проблеме ссылочного типа при кастинге.
Будет ли простой код, который может обрабатывать кастинг для объекта [] независимо от типа объекта, если он является массивом?
Я стараюсь избегать ручного управления всеми возможными типами литья.
заблаговременно
Ответы
Ответ 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();
}