/// <summary>
        /// Initializes a new instance of the <see cref="Unit"/> class.
        /// </summary>
        /// <param name="kind">The kind of unit.</param>
        /// <param name="granularity">The granularity of the unit.</param>
        public Unit(
            UnitOfTimeKind kind,
            UnitOfTimeGranularity granularity)
        {
            if (kind == UnitOfTimeKind.Invalid)
            {
                throw new ArgumentOutOfRangeException(nameof(kind), Invariant($"{nameof(kind)} is {nameof(UnitOfTimeKind)}.{nameof(UnitOfTimeKind.Invalid)}."));
            }

            if (granularity == UnitOfTimeGranularity.Invalid)
            {
                throw new ArgumentOutOfRangeException(nameof(granularity), Invariant($"{nameof(granularity)} is {nameof(UnitOfTimeGranularity)}.{nameof(UnitOfTimeGranularity.Invalid)}."));
            }

            if (granularity == UnitOfTimeGranularity.Unbounded)
            {
                throw new ArgumentOutOfRangeException(nameof(granularity), Invariant($"{nameof(granularity)} is {nameof(UnitOfTimeGranularity)}.{nameof(UnitOfTimeGranularity.Unbounded)}."));
            }

            if ((granularity == UnitOfTimeGranularity.Day) && (kind != UnitOfTimeKind.Calendar))
            {
                throw new ArgumentException(Invariant($"{nameof(granularity)} of {nameof(UnitOfTimeGranularity)}.{nameof(UnitOfTimeGranularity.Day)} is only applicable when {nameof(kind)} is {nameof(UnitOfTimeKind)}.{nameof(UnitOfTimeKind.Calendar)}; specified value is {kind}."));
            }

            this.Kind        = kind;
            this.Granularity = granularity;
        }
        /// <summary>
        /// Constructs a <see cref="UnitOfTime"/> whose <see cref="UnitOfTimeGranularity"/> is <see cref="UnitOfTimeGranularity.Year"/>
        /// from a year number and <see cref="UnitOfTimeKind"/>.
        /// </summary>
        /// <param name="year">The year.</param>
        /// <param name="unitOfTimeKind">The unit-of-time kind.</param>
        /// <returns>
        /// The <see cref="UnitOfTime"/>.
        /// </returns>
        /// <exception cref="ArgumentException"><paramref name="unitOfTimeKind"/> is <see cref="UnitOfTimeKind.Invalid"/>.</exception>
        public static UnitOfTime ToUnitOfTime(
            this int year,
            UnitOfTimeKind unitOfTimeKind)
        {
            if (unitOfTimeKind == UnitOfTimeKind.Invalid)
            {
                throw new ArgumentOutOfRangeException(Invariant($"'{nameof(unitOfTimeKind)}' == '{UnitOfTimeKind.Invalid}'"), (Exception)null);
            }

            UnitOfTime result;

            switch (unitOfTimeKind)
            {
            case UnitOfTimeKind.Calendar:
                result = year.ToCalendar();
                break;

            case UnitOfTimeKind.Fiscal:
                result = year.ToFiscal();
                break;

            case UnitOfTimeKind.Generic:
                result = year.ToGeneric();
                break;

            default:
                throw new NotSupportedException(Invariant($"This {nameof(UnitOfTimeKind)} is not supported: {unitOfTimeKind}"));
            }

            return(result);
        }
Esempio n. 3
0
        public Unit DeepCloneWithKind(UnitOfTimeKind kind)
        {
            var result = new Unit(
                kind,
                this.Granularity.DeepClone());

            return(result);
        }