更好的别名列表?

A better alias list?

我们有一个管理通用物理资源的系统。有超过 500 个单独的资源。该系统用于许多不同的事情,为了使软件更容易编写,我们使用别名。

例如,物理资源 TG67I9 的别名是 "RightDoor"。编写代码时,使用 RightDoor 代替 TG67I9 使代码更具可读性。此别名列表作为文本文件加载,其中包含对资源及其别名的引用。该系统实际上使用数百个不同的别名列表来引用相同的物理资源。

这种设置有两个主要缺点。首先,当使用别名调用资源时,它们作为字符串传入。 Door.Open("RightDoor") 例如。这不会提供任何工具提示或智能任何东西,使代码更难编写。它基本上需要不断引用别名列表。是 RightDoor 还是 Right_Door 还是 right-door 还是……你明白了。第二个是在执行之前不验证参数。编译器只知道传入了一个字符串,然后它很高兴。仅当代码为 运行 时,该函数才尝试通过其别名访问资源,但由于找不到正确的门而失败,因为它应该是 RightDoor。显示错误。这需要繁琐的调试和 运行 一遍又一遍地修改代码以清除任何错误的别名。

有更好的方法吗?这样就可以通过物理资源与其别名的交叉引用来制作别名列表,并且在制作列表之后,工具提示可能会出现建议资源。 (假设可以从头开始编写一个新系统)

我使用最新的 .NET 与 VisualStudio 2017 和 C# 来编写代码。

最简单的方法很可能是“string enum”:

public class Resources {
    public const string 
        LeftDoor  = "TG67I8", 
        RightDoor = "TG67I9";
}

示例使用:

Door.Open(Resources.RightDoor);

在 VS 中将鼠标悬停在 .RightDoor 上会显示工具提示 (constant) string Resources.RightDoor = "TG67I9"
右键单击 .RightDoor 并选择“查找所有引用”将显示变量的使用位置。


另一个选项可以是在项目属性的资源部分添加字符串,然后:

using YourProjectNameSpace.Properties;
...
Door.Open(Resources.RightDoor);

这有点慢,因为资源是在 运行 时检索的,但允许从独立于可执行文件的自定义外部文件加载资源。

使用带有常量的静态 class。我已经做过很多次了,现在仍然这样做。加上 .NET does this as well.

public static class PhysicalResources
{
    public const string One = "Uno";
    public const string Two = "Deux";
    // ...
}