C #: есть ли способ изменить размер массива неизвестного типа с помощью отражения? - PullRequest
1 голос
/ 21 января 2011

Мои пользователи передают мне массив некоторого типа, скажем, int [] или string []. Я могу легко запросить типы элементов через GetElementType и узнать, сколько времени длился массив, когда он был передан мне через GetRank, GetLength и т. Д.

Массивы передаются в списке параметров, поэтому визуализируйте код следующим образом:

    public void Resizer(params object[] objs)
    {
        foreach (object o in objs)
            Array.Resize(ref o, 3);
    }

То, что я хотел бы сделать, - это противоположность методов Get, которые доступны и которые работают: я хочу изменить размер переданного мне массива, установив длину на другую длину (например, 3 в этом глупом примере) ).

Я делаю это, потому что в моих настройках массив будет содержать данные, полученные от набора серверов облачных вычислений, и мы не можем знать, сколько из них ответит заранее, поэтому не можем предварительно выделить массив, чтобы иметь правильную длину , В идеале, фактически, мой пользователь передает массив длины 0, а я передаю обратно массив длины n, что означает, что я получил n ответов от серверов, которые были запросами.

Я не могу сделать это с Array.Resize (ref T, int), потому что я не знаю T во время компиляции.

Есть ли способ это осуществить?

Ответы [ 5 ]

5 голосов
/ 21 января 2011

Это должно работать:

static void Resize(ref Array array, int newSize) {        
    Type elementType = array.GetType().GetElementType();
    Array newArray = Array.CreateInstance(elementType, newSize);
    Array.Copy(array, newArray, Math.Min(array.Length, newArray.Length));
    array = newArray;
}
2 голосов
/ 21 января 2011

Почему бы просто не создать новый массив того типа, который вам нужен, того размера, который вам нужен?Затем заполните его из массива, размер которого вы хотите изменить, установив для несуществующих значений значения по умолчанию.

1 голос
/ 02 января 2012

На случай, если кому-то интересно, я переключил свой код на использование списка

0 голосов
/ 21 января 2011

Полагаю, я просто переключусь на использование списков, но это позор;код будет выглядеть немного более запутанным, и поскольку мои пользователи в основном находятся на уровне юградов первого семестра, каждая мелочь сделает их жизнь менее хорошей.Но я подозреваю, что вы, ребята, тоже не видите способа сделать это.Ну да ладно ....

0 голосов
/ 21 января 2011

Я согласен с комментариями, что вы должны использовать List (Of T), но если вы хотите скопировать свой массив в новый массив того же типа, вы можете сделать что-то вроде следующего.

// Your passed in array.
object[] objs = new object[5] {1,2,3,4,5};

// Create an array of the same type.
Array a = Array.CreateInstance(objs[0].GetType(), objs.Length+3);

// Copy in values.
objs.CopyTo(a,0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...