示例#1
0
        public override uint GetPhysicalLength()
        {
            if (Value == null)
            {
                return(1);
            }

            switch (Type.GetTypeCode(Value.GetType()))
            {
            case TypeCode.Boolean:
            case TypeCode.Byte:
            case TypeCode.SByte:
                return(sizeof(byte));

            case TypeCode.Char:
            case TypeCode.Int16:
            case TypeCode.UInt16:
                return(sizeof(ushort));

            case TypeCode.Single:
            case TypeCode.Int32:
            case TypeCode.UInt32:
                return(sizeof(uint));

            case TypeCode.Double:
            case TypeCode.Int64:
            case TypeCode.UInt64:
                return(sizeof(ulong));

            case TypeCode.String:
                return((Value as string).GetSerStringSize());
            }

            var typeSignature = Value as TypeSignature;

            if (typeSignature != null)
            {
                return(TypeNameBuilder.GetAssemblyQualifiedName(typeSignature).GetSerStringSize());
            }

            throw new NotSupportedException("Invalid or unsupported argument element value in custom attribute.");
        }
示例#2
0
        /// <inheritdoc />
        public override void Write(MetadataBuffer buffer, IBinaryStreamWriter writer)
        {
            if (Value == null)
            {
                writer.WriteSerString(null);
                return;
            }

            switch (Type.GetTypeCode(Value.GetType()))
            {
            case TypeCode.Boolean:
                writer.WriteByte((byte)((bool)Value ? 1 : 0));
                break;

            case TypeCode.Byte:
                writer.WriteByte((byte)Value);
                break;

            case TypeCode.Char:
                writer.WriteUInt16((char)Value);
                break;

            case TypeCode.Double:
                writer.WriteDouble((double)Value);
                break;

            case TypeCode.Int16:
                writer.WriteInt16((short)Value);
                break;

            case TypeCode.Int32:
                writer.WriteInt32((int)Value);
                break;

            case TypeCode.Int64:
                writer.WriteInt64((long)Value);
                break;

            case TypeCode.SByte:
                writer.WriteSByte((sbyte)Value);
                break;

            case TypeCode.Single:
                writer.WriteSingle((float)Value);
                break;

            case TypeCode.String:
                writer.WriteSerString((string)Value);
                break;

            case TypeCode.UInt16:
                writer.WriteUInt16((ushort)Value);
                break;

            case TypeCode.UInt32:
                writer.WriteUInt32((uint)Value);
                break;

            case TypeCode.UInt64:
                writer.WriteUInt64((ulong)Value);
                break;

            default:
                if (Value is TypeSignature typeSignature)
                {
                    writer.WriteSerString(TypeNameBuilder.GetAssemblyQualifiedName(typeSignature));
                }
                else
                {
                    throw new NotSupportedException();
                }
                break;
            }
        }
示例#3
0
        public override void Write(WritingContext context)
        {
            if (Value == null)
            {
                throw new ArgumentNullException();
            }

            var writer = context.Writer;

            switch (Type.GetTypeCode(Value.GetType()))
            {
            case TypeCode.Boolean:
                writer.WriteByte((byte)((bool)Value ? 1 : 0));
                break;

            case TypeCode.Byte:
                writer.WriteByte((byte)Value);
                break;

            case TypeCode.Char:
                writer.WriteUInt16((char)Value);
                break;

            case TypeCode.Double:
                writer.WriteDouble((double)Value);
                break;

            case TypeCode.Int16:
                writer.WriteInt16((short)Value);
                break;

            case TypeCode.Int32:
                writer.WriteInt32((int)Value);
                break;

            case TypeCode.Int64:
                writer.WriteInt64((long)Value);
                break;

            case TypeCode.SByte:
                writer.WriteSByte((sbyte)Value);
                break;

            case TypeCode.Single:
                writer.WriteSingle((float)Value);
                break;

            case TypeCode.String:
                writer.WriteSerString((string)Value);
                break;

            case TypeCode.UInt16:
                writer.WriteUInt16((ushort)Value);
                break;

            case TypeCode.UInt32:
                writer.WriteUInt32((uint)Value);
                break;

            case TypeCode.UInt64:
                writer.WriteUInt64((ulong)Value);
                break;

            default:
                var typeSignature = Value as TypeSignature;
                if (typeSignature != null)
                {
                    writer.WriteSerString(TypeNameBuilder.GetAssemblyQualifiedName(typeSignature));
                }
                else
                {
                    throw new NotSupportedException();
                }
                break;
            }
        }