有条件地添加 IAsyncDisposable?
Conditionally add IAsyncDisposable?
.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
但是,没有。 .NET Core 3.0 应用程序实际上并不 set NETSTANDARD2_1
。所以我可以将其更改为 #if NETSTANDARD2_1 || NETCOREAPP3_0 || NETCOREAPP3_1
,但现在我的代码将在 .NET 5 发布后中断。然后在一年后 .NET 6 发布时再次出现。
NETCOREAPP
本身也可能不起作用:.NET Core 2.2 及以下版本不支持 IAsyncDisposable
.
TL;DR:如何查询“如果 .NET Standard 2.1 或 .NET Core 3.0 或更高版本”?
(edit) 这是生成的源代码,所以我无法访问 MSBuild 之类的东西。它需要是一种在 C# 中工作的方式。
更新: It looks like .NET 6.0 SDK 将解决此问题。
这真的很丑陋,但您可以将类似的内容放在代码文件的顶部,您需要在其中检查是否支持 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 的新版本。
.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
但是,没有。 .NET Core 3.0 应用程序实际上并不 set NETSTANDARD2_1
。所以我可以将其更改为 #if NETSTANDARD2_1 || NETCOREAPP3_0 || NETCOREAPP3_1
,但现在我的代码将在 .NET 5 发布后中断。然后在一年后 .NET 6 发布时再次出现。
NETCOREAPP
本身也可能不起作用:.NET Core 2.2 及以下版本不支持 IAsyncDisposable
.
TL;DR:如何查询“如果 .NET Standard 2.1 或 .NET Core 3.0 或更高版本”?
(edit) 这是生成的源代码,所以我无法访问 MSBuild 之类的东西。它需要是一种在 C# 中工作的方式。
更新: It looks like .NET 6.0 SDK 将解决此问题。
这真的很丑陋,但您可以将类似的内容放在代码文件的顶部,您需要在其中检查是否支持 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 的新版本。