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

namespace System.Runtime.CompilerServices;

/// <summary>标识方法为异步迭代器</summary>
/// <remarks>初始化 <see cref="AsyncIteratorStateMachineAttribute"/> 实例</remarks>
/// <param name="stateMachineType">底层状态机类型</param>
[AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = false)]
public sealed class AsyncIteratorStateMachineAttribute(Type stateMachineType) : StateMachineAttribute(stateMachineType) { }

/// <summary>标识参数应接收来自 <see cref="IAsyncEnumerable{T}.GetAsyncEnumerator"/> 的取消令牌</summary>
[AttributeUsage(AttributeTargets.Parameter, Inherited = false)]
public sealed class EnumeratorCancellationAttribute : Attribute { }

/// <summary>表示异步迭代器的构建器</summary>
/// <remarks>
/// 编译器生成的异步迭代器状态机使用此类型协调 async/await 与 yield return 逻辑。
/// 此为 .NET Standard 2.0 / .NET Framework 降级实现,通过包装 <see cref="AsyncTaskMethodBuilder"/> 提供等效能力。
/// </remarks>
[StructLayout(LayoutKind.Auto)]
public struct AsyncIteratorMethodBuilder
{
    private AsyncTaskMethodBuilder _methodBuilder; // 可变结构体,请勿设为 readonly
    private Object? _id;

    /// <summary>创建 <see cref="AsyncIteratorMethodBuilder"/> 实例</summary>
    /// <returns>已初始化的实例</returns>
    public static AsyncIteratorMethodBuilder Create() =>
        new() { _methodBuilder = AsyncTaskMethodBuilder.Create() };

    /// <summary>在保护 <see cref="ExecutionContext"/> 的同时,调用状态机的 MoveNext</summary>
    /// <typeparam name="TStateMachine">状态机类型</typeparam>
    /// <param name="stateMachine">状态机实例(按引用传递)</param>
    [MethodImpl(MethodImplOptions.AggressiveInlining)]
    public void MoveNext<TStateMachine>(ref TStateMachine stateMachine) where TStateMachine : IAsyncStateMachine =>
        _methodBuilder.Start(ref stateMachine);

    /// <summary>在指定的等待者完成时调度状态机继续执行</summary>
    /// <typeparam name="TAwaiter">等待者类型</typeparam>
    /// <typeparam name="TStateMachine">状态机类型</typeparam>
    /// <param name="awaiter">等待者</param>
    /// <param name="stateMachine">状态机</param>
    public void AwaitOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine)
        where TAwaiter : INotifyCompletion
        where TStateMachine : IAsyncStateMachine =>
        _methodBuilder.AwaitOnCompleted(ref awaiter, ref stateMachine);

    /// <summary>在指定的等待者完成时调度状态机继续执行(不安全版本)</summary>
    /// <typeparam name="TAwaiter">等待者类型</typeparam>
    /// <typeparam name="TStateMachine">状态机类型</typeparam>
    /// <param name="awaiter">等待者</param>
    /// <param name="stateMachine">状态机</param>
    public void AwaitUnsafeOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine)
        where TAwaiter : ICriticalNotifyCompletion
        where TStateMachine : IAsyncStateMachine =>
        _methodBuilder.AwaitUnsafeOnCompleted(ref awaiter, ref stateMachine);

    /// <summary>标记迭代已完成(无论成功还是失败)</summary>
    public void Complete() => _methodBuilder.SetResult();

    /// <summary>获取可用于调试器唯一标识此构建器的对象</summary>
    internal Object ObjectIdForDebugger => _id ?? Interlocked.CompareExchange(ref _id, new Object(), null) ?? _id!;
}
#endif