Этот вопрос уже имеет ответ здесь:
Я не могу выяснить, как сделать эту работу:
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
Каков секретный соус? Я могу заставить второй работать, если я могу получить тип элементов массива, но я не полагал что один также.
Просто чтобы добавить к ответу Джона. Причина неудачной попытки 1 заключается в том, что для Int32 []
нет конструктора по умолчанию. Вам нужно указать длину. Если вы используете перегрузку, которая принимает массив аргументов, она будет работать:
// attempt1
object y1 = Activator.CreateInstance(t, new object[] { 1 }); // Length 1
Вам понадобится 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
требуется тип элемента создаваемого массива, а не конечный тип массива.