Beispiel #1
0
        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);
            }
        }