【发布时间】:2018-07-09 09:21:13
【问题描述】:
我正在尝试使用特定上下文/范围内的可用变量动态格式化某些字符串。
此字符串将包含{{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 } );
现在,我不再使用双括号了。
【问题讨论】:
-
没有什么是 C# 的一部分,你需要一个神奇的方法。
标签: c# .net string-interpolation