c# - 动态字符串插值

Jin*_*n-K 5 .net c# string-interpolation

我正在尝试使用特定上下文/范围中的可用变量动态格式化一些字符串。

该字符串将包含诸如 之类的部分{{parameter1}}{{parameter2}}并且这些变量将存在于我将尝试重新格式化字符串的范围内。变量名应该匹配。

我寻找了诸如动态字符串插值方法或如何使用 FormattableStringFactory 之类的东西,但我没有找到真正能满足我需求的东西。

var parameter1 = DateTime.Now.ToString();
var parameter2 = "Hello world!";
var retrievedString = "{{parameter2}} Today we're {{parameter1}}";
var result = MagicMethod(retrievedString, parameter1, parameter2);
// or, var result = MagicMethod(retrievedString, new { parameter1, parameter2 });
Run Code Online (Sandbox Code Playgroud)

是否有现有的解决方案,或者我应该(在MagicMethod)中将这些部分替换retrievedString为作为参数给出的匿名对象的匹配成员(使用反射或类似的东西)?

编辑:

最后,我创建了一个扩展方法来处理这个问题:

internal static string SpecialFormat(this string input, object parameters) {
  var type = parameters.GetType();
  System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex( "\\{(.*?)\\}" );
  var sb = new System.Text.StringBuilder();
  var pos = 0;

  foreach (System.Text.RegularExpressions.Match toReplace in regex.Matches( input )) {
    var capture = toReplace.Groups[ 0 ];
    var paramName = toReplace.Groups[ toReplace.Groups.Count - 1 ].Value;
    var property = type.GetProperty( paramName );
    if (property == null) continue;
    sb.Append( input.Substring( pos, capture.Index - pos) );
    sb.Append( property.GetValue( parameters, null ) );
    pos = capture.Index + capture.Length;
  }

  if (input.Length > pos + 1) sb.Append( input.Substring( pos ) );

  return sb.ToString();
}
Run Code Online (Sandbox Code Playgroud)

我这样称呼它:

var parameter1 = DateTime.Now.ToString();
var parameter2 = "Hello world!";
var retrievedString = "{parameter2} Today we're {parameter1}";
var result = retrievedString.SpecialFormat( new { parameter1, parameter2 } );
Run Code Online (Sandbox Code Playgroud)

现在,我不再使用双括号了。

Dav*_*idG 8

您可以将反射与匿名类型结合使用来执行此操作:

public string StringFormat(string input, object parameters)
{
    var properties = parameters.GetType().GetProperties();
    var result = input;

    foreach (var property in properties)
    {
        result = result.Replace(
            $"{{{{{property.Name}}}}}", //This is assuming your param names are in format "{{abc}}"
            property.GetValue(parameters).ToString());
    }

    return result;
}
Run Code Online (Sandbox Code Playgroud)

并这样称呼它:

var result = StringFormat(retrievedString, new { parameter1, parameter2 });
Run Code Online (Sandbox Code Playgroud)