Условно добавить IAsyncDisposable? - PullRequest
2 голосов
/ 07 августа 2020

. NET Стандартный 2.1 добавляет IAsyncDisposable. Я могу использовать это в ORM API:

    public partial class MyDbContext : IAsyncDisposable
    {
        public async ValueTask DisposeAsync()
        {
            if (Connection != null)
                await Connection.DisposeAsync();
        }
    }

… но многие из моих пользователей все еще используют NET Standard 2.0. Знаю, добавлю символы препроцессора!

#if NETSTANDARD2_1
    …
#endif

Но нет. A. NET Приложение Core 3.0 на самом деле не устанавливает NETSTANDARD2_1. Так что я могу изменить его на #if NETSTANDARD2_1 || NETCOREAPP3_0 || NETCOREAPP3_1, но теперь мой код сломается один раз. NET 5 отправлено. И снова, когда. NET 6 будет отправлен годом позже.

NETCOREAPP сам по себе тоже, вероятно, не работает:. NET Core 2.2 и ниже не поддерживают IAsyncDisposable.

TL; DR: как мне запросить «if. NET Standard 2.1 или. NET Core 3.0 или новее »?

(изменить) Это сгенерированный исходный код, поэтому я не могу получить доступ к таким вещам, как MSBuild. Это должен быть способ, работающий изнутри C#.

1 Ответ

1 голос
/ 07 августа 2020

Это ДЕЙСТВИТЕЛЬНО УЖАСНО, но вы можете поместить что-то подобное в верхней части файлов кода, где вам нужно проверить, поддерживается ли IAsyncDisposable:

#if (NETCOREAPP && !NETCOREAPP1_0 && !NETCOREAPP1_1 && !NETCOREAPP2_0 && !NETCOREAPP2_1 && !NETCOREAPP2_2) || (NETSTANDARD && !NETSTANDARD1_0 && !NETSTANDARD1_1 && !NETSTANDARD1_2 && !NETSTANDARD1_3 && !NETSTANDARD1_4 && !NETSTANDARD1_5 && !NETSTANDARD1_6 && !NETSTANDARD2_0)
    #define SUPPORTS_IASYNC_DISPOSABLE
#endif

Затем позже в файле вы можете просто сделать

#if SUPPORTS_IASYNC_DISPOSABLE
    Console.WriteLine("Supported");
#else
    Console.WriteLine("Not supported");
#endif

Это должно работать для будущих версий. Net, предполагая, что они не представляют новую версию, которая по какой-то причине не поддерживает IAsyncDisposable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...