コード例 #1
0
        public string GetString()
        {
            if (_tokenType == BinaryTokenType.Null)
            {
                return(null);
            }

            if (TokenType != BinaryTokenType.Bytes)
            {
                throw ThrowHelper.GetInvalidOperationException_ExpectedString(TokenType);
            }

            ReadOnlySpan <byte> span = ValueSpan;

            return(BinaryReaderHelper.TranscodeHelper(span));
        }
コード例 #2
0
        internal static BinaryPropertyInfo LookupProperty(
            object obj,
            ReadOnlySpan <byte> unescapedPropertyName,
            ref ReadStack state,
            out bool useExtensionProperty,
            bool createExtensionProperty = true)
        {
            Debug.Assert(state.Current.BinaryClassInfo.ClassType == ClassType.Object || state.Current.BinaryClassInfo.ClassType == ClassType.Enumerable || state.Current.BinaryClassInfo.ClassType == ClassType.Dictionary);

            useExtensionProperty = false;

            BinaryPropertyInfo binaryPropertyInfo = state.Current.BinaryClassInfo.GetProperty(
                unescapedPropertyName,
                ref state.Current,
                out byte[] utf8PropertyName);

            // Increment PropertyIndex so GetProperty() checks the next property first when called again.
            state.Current.PropertyIndex++;

            // For case insensitive and missing property support of BinaryPath, remember the value on the temporary stack.
            state.Current.BinaryPropertyName = utf8PropertyName;

            // Determine if we should use the extension property.
            if (binaryPropertyInfo == BinaryPropertyInfo.s_missingProperty)
            {
                BinaryPropertyInfo dataExtProperty = state.Current.BinaryClassInfo.DataExtensionProperty;
                if (dataExtProperty != null && dataExtProperty.HasGetter && dataExtProperty.HasSetter)
                {
                    state.Current.BinaryPropertyNameAsString = BinaryReaderHelper.TranscodeHelper(unescapedPropertyName);

                    if (createExtensionProperty)
                    {
                        CreateDataExtensionProperty(ref state, obj, dataExtProperty);
                    }

                    binaryPropertyInfo   = dataExtProperty;
                    useExtensionProperty = true;
                }
            }

            state.Current.BinaryPropertyInfo = binaryPropertyInfo;
            return(binaryPropertyInfo);
        }