在String.Format中使用数组

时间:2014-02-05 08:58:26

标签: c# .net string-formatting

目前我正在开发一个依赖于Web API的应用程序。我创建了一个包含许多API字符串的类,如:/api/lol/static-data/{region}/v1/champion/{id}。我也做了一个方法:

public static String request(String type, Object[] param)
{
    return "";
}

这将是请求的东西。因为每个请求类型都有很多不同,所以使用了多少个参数,我正在使用一个数组。现在的问题是,String.Format是否可以使用数组作为参数,而字符串中的键不是数字?或者有人知道如何以不同的方式做到这一点吗?

1 个答案:

答案 0 :(得分:2)

不,string.Format仅支持基于索引的参数规范。

此:

"/api/lol/static-data/{region}/v1/champion/{id}"
                      ^^^^^^^^             ^^^^

必须使用其他方法处理,例如string.ReplaceRegex

您需要:

  • 确定进行替换的适当方法
  • 决定具有基于索引的值的数组应如何映射到参数,它们是否位于位置?即。 {region}是数组的第一个元素,{id}是第二个,等等?

这是一个简单的LINQPad程序,演示 I 将如何做到(虽然我会添加更多的错误处理,如果执行此操作可能会缓存反射信息很多,一些单元测试等等):

void Main()
{
    string input = "/api/lol/static-data/{region}/v1/champion/{id}";
    string output = ReplaceArguments(input, new
    {
        region = "Europe",
        id = 42
    });
    output.Dump();
}

public static string ReplaceArguments(string input, object arguments)
{
    if (arguments == null || input == null)
        return input;

    var argumentsType = arguments.GetType();
    var re = new Regex(@"\{(?<name>[^}]+)\}");
    return re.Replace(input, match =>
    {
        var pi = argumentsType.GetProperty(match.Groups["name"].Value);
        if (pi == null)
            return match.Value;

        return (pi.GetValue(arguments) ?? string.Empty).ToString();
    });
}