首页 > 解决方案 > 使用 DependentUpon 时可以覆盖资源名称吗?

问题描述

在使用JetBrains Rider时,我喜欢通过将文件拖放到其他文件上来组织我的代码以形成层次结构,例如接口的具体实现等。

我现在有一个将使用一些资源的类“EmbeddedResource”,这些是 JSON 文件。我想按类别/主题拆分这些 JSON 文件以使其易于管理,而不是只有一个大文件。

但是,当我将嵌入式资源文件放到将要使用它们的类文件中时,会出现编译错误。

此外,项目中的资源名称已更改。显然,使嵌入资源依赖于 C# 类文件会使资源的名称与 C# 类文件的文件名相同,而不是包含嵌入资源的文件的名称。

举一个我所做的例子可能会更好。

这是我所做的验证:

  1. 创建一个新的 .NET Core 2.2 控制台应用程序(名为 ConsoleApp4)
  2. 在项目中添加一个json文件,命名为file1.json
  3. 右击这个文件,属性,设置为 EmbeddedResource 编译动作
  4. 将以下代码放入 Program.Main,替换现有代码:

    foreach (var name in typeof(Program).Assembly.GetManifestResourceNames())
        Console.WriteLine(name);
    
  5. 运行程序

这输出:

ConsoleApp4.file1.json

正如预期的那样。

然后,我重复了第 2 步和第 3 步,获取file2.json,重新运行,果然,现在我有两个资源命名file1file2具有与上面相同的模式。

然后我将其中一个 json 文件拖到 Program 的顶部,这样 Rider 就有了这样的组织:

骑手档案组织

如果我现在重新运行程序,我会得到以下输出:

ConsoleApp4.Program
ConsoleApp4.file2.json

使文件依赖于 Program 的行为改变了结果资源的名称。如果我将第二个 json 文件也拖动到 Program 顶部,则在尝试重建时会出现此编译器错误:

资源标识符“ConsoleApp4.Program”已在此程序集中使用

项目文件现在包含以下几行:

<ItemGroup>
  <None Remove="file1.json" />
  <EmbeddedResource Include="file1.json">
    <DependentUpon>Program.cs</DependentUpon>
  </EmbeddedResource>
  <None Remove="file2.json" />
  <EmbeddedResource Include="file2.json">
    <DependentUpon>Program.cs</DependentUpon>
  </EmbeddedResource>
</ItemGroup>

我的问题很简单:

当我使嵌入资源依赖于另一个文件时,我有没有办法更改嵌入资源的名称,就像我在上面所做的那样?有什么我可以添加到项目文件中来覆盖用于生成资源的名称的东西吗?

项目文件中没有提到资源现在将继承它所依赖的文件的名称,这是编译器使用的某种形式的约定。

标签: c#embedded-resource

解决方案


推荐阅读