using System;
using System.Collections.ObjectModel;
using System.Reflection;
using System.Reflection.Emit;
namespace System.Linq.Expressions
{
/// Represents creating a new array and possibly initializing the elements of the new array.
// Token: 0x0200002C RID: 44
public sealed class NewArrayExpression : Expression
{
// Token: 0x06000239 RID: 569 RVA: 0x0000BD5C File Offset: 0x00009F5C
internal NewArrayExpression(ExpressionType et, Type type, ReadOnlyCollection expressions)
: base(et, type)
{
this.expressions = expressions;
}
/// Gets the bounds of the array if the value of the property is , or the values to initialize the elements of the new array if the value of the property is .
/// A of objects which represent either the bounds of the array or the initialization values.
// Token: 0x1700002F RID: 47
// (get) Token: 0x0600023A RID: 570 RVA: 0x0000BD70 File Offset: 0x00009F70
public ReadOnlyCollection Expressions
{
get
{
return this.expressions;
}
}
// Token: 0x0600023B RID: 571 RVA: 0x0000BD78 File Offset: 0x00009F78
private void EmitNewArrayInit(EmitContext ec, Type type)
{
int count = this.expressions.Count;
ec.ig.Emit(OpCodes.Ldc_I4, count);
ec.ig.Emit(OpCodes.Newarr, type);
for (int i = 0; i < count; i++)
{
ec.ig.Emit(OpCodes.Dup);
ec.ig.Emit(OpCodes.Ldc_I4, i);
this.expressions[i].Emit(ec);
ec.ig.Emit(OpCodes.Stelem, type);
}
}
// Token: 0x0600023C RID: 572 RVA: 0x0000BE0C File Offset: 0x0000A00C
private void EmitNewArrayBounds(EmitContext ec, Type type)
{
int count = this.expressions.Count;
ec.EmitCollection(this.expressions);
if (count == 1)
{
ec.ig.Emit(OpCodes.Newarr, type);
return;
}
ec.ig.Emit(OpCodes.Newobj, NewArrayExpression.GetArrayConstructor(type, count));
}
// Token: 0x0600023D RID: 573 RVA: 0x0000BE64 File Offset: 0x0000A064
private static ConstructorInfo GetArrayConstructor(Type type, int rank)
{
return NewArrayExpression.CreateArray(type, rank).GetConstructor(NewArrayExpression.CreateTypeParameters(rank));
}
// Token: 0x0600023E RID: 574 RVA: 0x0000BE78 File Offset: 0x0000A078
private static Type[] CreateTypeParameters(int rank)
{
return Enumerable.Repeat(typeof(int), rank).ToArray();
}
// Token: 0x0600023F RID: 575 RVA: 0x0000BE90 File Offset: 0x0000A090
private static Type CreateArray(Type type, int rank)
{
return type.MakeArrayType(rank);
}
// Token: 0x06000240 RID: 576 RVA: 0x0000BE9C File Offset: 0x0000A09C
internal override void Emit(EmitContext ec)
{
Type elementType = base.Type.GetElementType();
ExpressionType nodeType = base.NodeType;
if (nodeType == ExpressionType.NewArrayInit)
{
this.EmitNewArrayInit(ec, elementType);
return;
}
if (nodeType != ExpressionType.NewArrayBounds)
{
throw new NotSupportedException();
}
this.EmitNewArrayBounds(ec, elementType);
}
// Token: 0x040000B9 RID: 185
private ReadOnlyCollection expressions;
}
}