首页 > 解决方案 > 方法参数智能

问题描述

我有一个字符串列表,这些字符串是方法的有效输入。字符串列表很长,可能会存储在数据库中(但不是 100% 必要 - 可能在资源文件中。我想在理想的世界中,验证传递给方法的字符串是否有效有点像一个枚举。我不想创建一个枚举,因为输入列表将通过调用另一个系统来生成。我希望能够自动生成输入以更新数据库或资源文件。


// Magic String
public void Test()
{
    var result =  DoSomething("myFieldName");
}

// would like myFieldName to be some sort of intellesence
public void Test()
{
    var result =  DoSomething(myFieldName);
}


public string DoSomething(string input)
{
    return $"Hello {input}";
}

我想避免传递魔术字符串,因为可能有 100 多个值,并且开发人员将无法记住所有可能的输入。

谢谢!

标签: c#visual-studiointellisense

解决方案


一种方法是创建一个类,该类具有从数据源(可能是 app.config、数据库或其他一些数据存储)返回值的静态只读属性。

对于此示例,我使用以下 app.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="SomePropertyName" value="Some Property Value" />
    <add key="MyFieldName" value="Another value" />
  </appSettings>
</configuration>

接下来我们可以创建一个类,该类具有代表配置中键的属性,并且属性的值将从配置文件中提取。下面的示例类有一个私有方法,它将从配置中返回值(但是用从数据库中查找值的方法替换该方法很容易):

public static class ConfigKeys
{
    // Get-only properties that the developer can access
    public static string MyFieldName => GetString("MyFieldName");
    public static string AnotherFieldName => GetString("SomePropertyName");

    // Returns the actual string from the data source (app.config, database, etc)
    private static string GetString(string propertyName)
    {
        return ConfigurationManager.AppSettings.Get(propertyName);
    }
}

那么从开发人员的角度来看,他们所要做的就是:

public static void Main()
{
    DoSomething(ConfigKeys.MyFieldName);

    // rest of code omitted
}

推荐阅读