c# - 动态字符串插值

标签 c# .net 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 });

是否有现有的解决方案,或者我是否应该(在 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();
}

我这样调用它:

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

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

最佳答案

你可以使用反射和匿名类型来做到这一点:

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;
}

然后这样调用它:

var result = StringFormat(retrievedString, new { parameter1, parameter2 });

关于c# - 动态字符串插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51242089/

相关文章:

javascript - AngularJS刷新插值

c# - 带字符串插值的重载字符串方法

c# - 使用最小起订量模拟 EF DbContext

c# - 什么是 IF 语句中的 OR 运算符

asp.net - 未将对象引用设置为构建网站上的对象实例

.net - PowerShell 中的 WinSCP .NET 程序集 - 创建 SessionOptions - 提供的值无效,或属性为只读

c# - 反射说接口(interface)方法在实现类型中是虚拟的,而实际上它们不是?

c# - "where"在 C# 类声明中意味着什么?

.net - 在网络农场环境中,我们应该将系统日期/时间基于网络服务器还是数据库服务器?

vb.net - 字符串插值输出枚举名称而不是值