PragmaGames
@PragmaGames
Увлекаюсь Unity.

Как конвертировать object[] к Class[] где Class пользовательский класс?

Всем привет. Есть примерно такой код :
public void A(Class[] class)
{
   TODO
}

------
var classes = new object[5];
A(classes);


Данный код выдает ошибку
ArgumentException: Object of type 'System.Object[]' cannot be converted to type 'TestScripts.Test4[]'.

Как решить такой трабл явно не приводя массив к нужному типу ?
  • Вопрос задан
  • 258 просмотров
Решения вопроса 1
Как решить такой трабл явно не приводя массив к нужному типу ?

Эмм, а как должно это работать? У тебя массив обжектов, а ты ждёшь массив из Class-ов.
Тебе нужна функция которая будет преобразовывать каждый элемент по отдельности, ибо в этом массиве не обязательно будет лежать Class.
Может проще сразу массив нужного типа создать?

Вообще вариантов несколько:
1. Через Select и некую функцию, которая преобразует объект в твой тип.
var classes = objects.Select(ConvertObjectToClass).ToArray();

2. Через метод Cast - тогда просто произойдёт даункаст каждого элемента.
var classes = objects.Cast<Class>().ToArray();
3. Через Unsafe, но только если ты заранее знаешь, что внутри этого массива только Class-ы, а не какие-то другие типы, которые с ним не совместимы. Иначе получишь мусор вместо данных. Со структурами, конечно, работать не будет.
var classes = System.Runtime.CompilerServices.Unsafe.As<Class[]>(objects);

Вот что кстати будет

using System.Runtime.CompilerServices;
var objects = new object[] { new A { x = 1 }, new B { y = 2, z = 3 } };
var something = Unsafe.As<A[]>(objects);
Console.WriteLine(something[0].x); // 1
Console.WriteLine(something[1].x); // 2
var something2 = Unsafe.As<B[]>(objects);
Console.WriteLine($"{something2[0].y} {something2[0].z}"); // 1 0
Console.WriteLine($"{something2[1].y} {something2[1].z}"); // 2 3
class A
{
    public int x;
}
class B
{
    public int y;
    public int z;
}

А вот если добавить ещё поле - всё совсем поломается.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы