解决MySql布尔型新旧版本兼容问题,采用枚举来表示布尔型的数据表。由正向工程赋值
大石头 authored at 2018-05-15 21:21:05
3.95 KiB
X
#if NETFRAMEWORK || NETSTANDARD2_0
using System.Runtime.InteropServices;

namespace System.Runtime.CompilerServices;

/// <summary>提供对 <see cref="IAsyncDisposable"/> 上等待行为的配置支持</summary>
[StructLayout(LayoutKind.Auto)]
public readonly struct ConfiguredAsyncDisposable
{
    private readonly IAsyncDisposable _source;
    private readonly Boolean _continueOnCapturedContext;

    internal ConfiguredAsyncDisposable(IAsyncDisposable source, Boolean continueOnCapturedContext)
    {
        _source = source;
        _continueOnCapturedContext = continueOnCapturedContext;
    }

    /// <summary>异步释放当前对象使用的非托管资源</summary>
    /// <returns>表示异步释放操作的可等待对象</returns>
    public ConfiguredValueTaskAwaitable DisposeAsync() =>
        _source.DisposeAsync().ConfigureAwait(_continueOnCapturedContext);
}

/// <summary>提供可等待的异步枚举,支持可取消迭代和自定义等待上下文</summary>
/// <typeparam name="T">被迭代的对象类型</typeparam>
[StructLayout(LayoutKind.Auto)]
public readonly struct ConfiguredCancelableAsyncEnumerable<T>
{
    private readonly IAsyncEnumerable<T> _enumerable;
    private readonly CancellationToken _cancellationToken;
    private readonly Boolean _continueOnCapturedContext;

    internal ConfiguredCancelableAsyncEnumerable(IAsyncEnumerable<T> enumerable, Boolean continueOnCapturedContext, CancellationToken cancellationToken)
    {
        _enumerable = enumerable;
        _continueOnCapturedContext = continueOnCapturedContext;
        _cancellationToken = cancellationToken;
    }

    /// <summary>配置异步迭代中等待任务的方式</summary>
    /// <param name="continueOnCapturedContext">true 时捕获并切回当前上下文;false 则不捕获</param>
    /// <returns>已配置的可枚举对象</returns>
    public ConfiguredCancelableAsyncEnumerable<T> ConfigureAwait(Boolean continueOnCapturedContext) =>
        new(_enumerable, continueOnCapturedContext, _cancellationToken);

    /// <summary>设置传递给 <see cref="IAsyncEnumerable{T}.GetAsyncEnumerator"/> 的取消令牌</summary>
    /// <param name="cancellationToken">取消令牌</param>
    /// <returns>已配置的可枚举对象</returns>
    public ConfiguredCancelableAsyncEnumerable<T> WithCancellation(CancellationToken cancellationToken) =>
        new(_enumerable, _continueOnCapturedContext, cancellationToken);

    /// <summary>返回可对集合进行异步迭代的枚举器</summary>
    /// <returns>可枚举对象的枚举器</returns>
    public Enumerator GetAsyncEnumerator() =>
        new(_enumerable.GetAsyncEnumerator(_cancellationToken), _continueOnCapturedContext);

    /// <summary>提供可等待的异步枚举器,支持可取消迭代和自定义等待上下文</summary>
    [StructLayout(LayoutKind.Auto)]
    public readonly struct Enumerator
    {
        private readonly IAsyncEnumerator<T> _enumerator;
        private readonly Boolean _continueOnCapturedContext;

        internal Enumerator(IAsyncEnumerator<T> enumerator, Boolean continueOnCapturedContext)
        {
            _enumerator = enumerator;
            _continueOnCapturedContext = continueOnCapturedContext;
        }

        /// <summary>将枚举器异步推进到集合的下一个元素</summary>
        /// <returns>若成功推进到下一个元素则为 true;若已越过集合末尾则为 false</returns>
        public ConfiguredValueTaskAwaitable<Boolean> MoveNextAsync() =>
            _enumerator.MoveNextAsync().ConfigureAwait(_continueOnCapturedContext);

        /// <summary>获取集合中当前位置的元素</summary>
        public T Current => _enumerator.Current;

        /// <summary>异步释放枚举器使用的资源</summary>
        /// <returns>表示异步释放操作的可等待对象</returns>
        public ConfiguredValueTaskAwaitable DisposeAsync() =>
            _enumerator.DisposeAsync().ConfigureAwait(_continueOnCapturedContext);
    }
}
#endif