C#中的动态字符串模板

问题描述 投票:0回答:1

我正在寻找一种执行字符串内插的方法,但是模板字符串预先位于变量中,而不是使用true字符串解释,其中立即将$“ {a} {b}”参数化并返回。

有很多地方会很有用,但是最清楚的例子是,我正在编写一个ETL(提取转换负载)管道,其中包含我需要使用的许多不同的REST API。相同的两个参数重复出现在不同的URI中,我想用用户提供的值动态替换它们。下面列出了两个这样的示例。

  • http://www.example.com/projects/{projectId}/data
    • 例如,假设projectId1,我希望http://www.example.com/projects/1/data
  • http://www.example.com/project/{projectId}/data?uploadId={uploadId}

如果我在运行时拥有可用的值,例如,可以使用字符串插值轻松完成此操作。“>

int projectId = 1;
int uploadId = 3;
string uri = $"http://www.example.com/project/{projectId}/data?uploadId={uploadId}";
/* evaluates to "http://www.example.com/project/1/data?uploadId=1" */

但是我想构建这些参数化的字符串提前

,并能够用该上下文中可用的任何变量替换它们。换句话说,用伪代码:
int projectId = 1;
int uploadId = 3;
string uriTemplate = "http://www.example.com/project/{projectId}/data?uploadId={uploadId}";
string uri = ReplaceNameTags(uriTemplate, projectId, uploadId)
// example method signature
string ReplaceNametags(uriTemplate, params object[] args)
{
    /* insert magic here */
}

想到了反思,也许我可以以某种方式收集输入的名称,但是我对反思并不满意,我的所有尝试最终变得比完全放弃这个想法更为复杂。

String.Format()浮现在脑海中,但理想情况下,我不会受到所提供参数的序数位置的限制。

[我已经看到这种行为在所有地方都使用过(例如RestSharp,Swagger,ASP.NET路由),但是我不确定如何模仿它。

谢谢!

我正在寻找一种执行字符串插值的方法,但是模板字符串要提前放在变量中,而不是在$“ {a} {b}”立即出现的情况下使用真字符串解释...] >

c# string formatting interpolation templating
1个回答
0
投票

您可以将参数作为动态对象传递,遍历其键并利用Regex和nameof:

private string ReplaceNameTags(string uri, dynamic arguments)
    {
        string result = uri;
        var properties = arguments.GetType().GetProperties();
        foreach (var prop in properties)
        {
            object propValue = prop.GetValue(arguments, null);
            result = Regex.Replace(uri, $"{{{prop.Name}}}", propValue.ToString());
        }
        return result;
    }
© www.soinside.com 2019 - 2024. All rights reserved.