Альтернативой является использование деревьев выражений для производительности. Например, если у вас есть массив тип , type
вы могли бы сделать
var ctor = type.GetConstructors().First(); // or find suitable constructor
var argsExpr = ctor.GetParameters().Select(x => Expression.Constant(0));
var func = Expression.Lambda<Func<object>>(Expression.New(ctor, argsExpr)).Compile();
Это просто возвращает пустой массив. Вероятно, не очень полезно. Состояния MSDN GetConstructors
не гарантируют какой-либо порядок, поэтому вам может потребоваться логика для поиска правильного конструктора с правильными параметрами для создания экземпляра с правильным размером. Например, Вы могли бы сделать:
static Func<object> ArrayCreateInstance(Type type, params int[] bounds) // can be generic too
{
var ctor = type
.GetConstructors()
.OrderBy(x => x.GetParameters().Length) // find constructor with least parameters
.First();
var argsExpr = bounds.Select(x => Expression.Constant(x)); // set size
return Expression.Lambda<Func<object>>(Expression.New(ctor, argsExpr)).Compile();
}
То же самое может быть достигнуто гораздо проще с Expression.NewArrayBounds
вместо Expression.New
, более того, оно работает, если все, что вы получите, это тип элемента массива, а не сам тип массива. Демонстрация:
static Func<object> ArrayCreateInstance(Type type, params int[] bounds) // can be generic too
{
var argsExpr = bounds.Select(x => Expression.Constant(x)); // set size
var newExpr = Expression.NewArrayBounds(type.GetElementType(), argsExpr);
return Expression.Lambda<Func<object>>(newExpr).Compile();
}
// this exercise is pointless if you dont save the compiled delegate, but for demo purpose:
x = string[] {...
y = ArrayCreateInstance(x.GetType(), 10)(); // you get 1-d array with size 10
x = string[,,] {...
y = ArrayCreateInstance(x.GetType(), 10, 2, 3)(); // you get 3-d array like string[10, 2, 3]
x = string[][] {...
y = ArrayCreateInstance(x.GetType(), 10)(); // you get jagged array like string[10][]
Просто замените type.GetElementType()
на type
, если вы передаете сам тип элемента.