如何为 ItemGroup (*.csproj) 指定 '|net35|net40|net45|'.Contains($(TargetFramework)) 条件?

How to specify a '|net35|net40|net45|'.Contains($(TargetFramework)) condition for an ItemGroup (*.csproj)?

我有一个多目标 C# (SDK) 项目,我必须只在一些较旧的框架版本中包含某个文件,我可以像这样轻松实现它:

<ItemGroup Condition="('$(TargetFramework)'=='net35') Or ('$(TargetFramework)'=='net40') Or ('$(TargetFramework)'=='net45') Or ('$(TargetFramework)'=='net451') Or ('$(TargetFramework)'=='net452')">
  <!-- do something -->
</ItemGroup>

但这看起来有点笨拙而且不容易阅读,所以我尝试这样做(以及它的几十种变体)但没有成功:

<ItemGroup Condition="'|net35|net40|net403|net45|net451|net452|'.Contains('|$(TargetFramework)|')">
  <!-- do something -->
</ItemGroup>

有没有办法用字符串包含操作来做到这一点?

我查看了这样的帖子:Is there any MSbuild task to check if a string contains another string (similar to string.contains) 但他们在那里所做的似乎对我不起作用。

我使用的版本是Visual Studio2019(16.9.4)

您似乎无法直接对字符串文字调用实例字符串函数。 The MSBuild documentation 表示只能调用属性的实例方法。

通过将您当前内联的值移动到自定义 属性,然后您可以像这样使用此 属性 的 Contains 方法:

    <PropertyGroup>
        <Frameworks>|net35|net40|net403|net45|net451|net452|</Frameworks>
    </PropertyGroup>

    <ItemGroup Condition="$(Frameworks.Contains('|$(TargetFramework)|'))">
        <!-- do something -->
    </ItemGroup>