public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result) { int index = (int)indexes[0]; PrimitiveType memberAsPrimitive; ArrayType memberAsArray; if ((memberAsPrimitive = _arrayType.MemberType as PrimitiveType) != null) { switch (memberAsPrimitive.Kind) { case PrimitiveTypeKind.Boolean: result = _vm.GetBooleanArray(_arrayPtr)[index]; break; case PrimitiveTypeKind.Byte: result = _vm.GetByteArray(_arrayPtr)[index]; break; case PrimitiveTypeKind.Char: result = _vm.GetCharArray(_arrayPtr)[index]; break; case PrimitiveTypeKind.Double: result = _vm.GetDoubleArray(_arrayPtr)[index]; break; case PrimitiveTypeKind.Float: result = _vm.GetFloatArray(_arrayPtr)[index]; break; case PrimitiveTypeKind.Int: result = _vm.GetIntArray(_arrayPtr)[index]; break; case PrimitiveTypeKind.Long: result = _vm.GetLongArray(_arrayPtr)[index]; break; case PrimitiveTypeKind.Short: result = _vm.GetShortArray(_arrayPtr)[index]; break; default: throw new InvalidOperationException("Unknown primitive kind: " + memberAsPrimitive.Kind); } return(true); } else if ((memberAsArray = _arrayType.MemberType as ArrayType) != null) { result = new JavaArray(_vm, _vm.GetArray(_arrayPtr)[index], memberAsArray); return(true); } else { IntPtr objectPointer = _vm.GetArray(_arrayPtr)[index]; // I'll intentionally pass the actual type as null if we have a non-null object, so we can discover // the precise type instead of just assuming it's of the base class type. result = new JavaObject(_vm, objectPointer, objectPointer == IntPtr.Zero ? (JavaClass)_arrayType.MemberType : null); return(true); } }