Как я создаю массив C# с помощью Отражательного и только ввожу информацию? [дубликат]

Этот вопрос уже имеет ответ здесь:

Я не могу выяснить, как сделать эту работу:

object x = new Int32[7];
Type t = x.GetType();

// now forget about x, and just use t from here.

// attempt1 
object y1 = Activator.CreateInstance(t); // fails with exception

// attempt2
object y2 = Array.CreateInstance(t, 7);  // creates an array of type Int32[][] ! wrong

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

42
задан Mark Lakata 5 August 2010 в 21:46
поделиться

2 ответа

Просто чтобы добавить к ответу Джона. Причина неудачной попытки 1 заключается в том, что для Int32 [] нет конструктора по умолчанию. Вам нужно указать длину. Если вы используете перегрузку, которая принимает массив аргументов, она будет работать:

// attempt1 
object y1 = Activator.CreateInstance(t, new object[] { 1 }); // Length 1
40
ответ дан 26 November 2019 в 23:32
поделиться

Вам понадобится Type.GetElementType () , чтобы получить тип без массива:

object x = new Int32[7];
Type t = x.GetType();
object y = Array.CreateInstance(t.GetElementType(), 7);

В качестве альтернативы, если вы можете получить тип элемента напрямую, используйте это:

Type t = typeof(int);
object y = Array.CreateInstance(t, 7);

В основном, ] Array.CreateInstance требуется тип элемента создаваемого массива, а не конечный тип массива.

59
ответ дан 26 November 2019 в 23:32
поделиться
Другие вопросы по тегам:

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