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

Как создать массив С# с помощью Reflection и только ввести информацию?

Я не могу понять, как это сделать:

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

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

4b9b3361

Ответ 1

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

// attempt1 
object y1 = Activator.CreateInstance(t, new object[] { 1 }); // Length 1

Ответ 2

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