Jit*_*ari 17 c# string-interpolation
谁能帮我这个?
必需输出:" Todo job for admin "
class Program
{
static void Main(string[] args)
{
Console.WriteLine(ReplaceMacro("{job.Name} job for admin", new Job { Id = 1, Name = "Todo", Description="Nothing" }));
Console.ReadLine();
}
static string ReplaceMacro(string value, Job job)
{
return value; //Output should be "Todo job for admin"
}
}
class Job
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
Dan*_*Dan 28
两个建议:
的DataBinder.Eval
string ReplaceMacro(string value, Job job)
{
return Regex.Replace(value, @"{(?<exp>[^}]+)}", match => {
return (System.Web.UI.DataBinder.Eval(new { Job = job }, match.Groups["exp"].Value) ?? "").ToString();
});
}
Run Code Online (Sandbox Code Playgroud)
Linq.Expression
使用MSDN LINQSamples中提供的Dynamic Query类:
string ReplaceMacro(string value, Job job)
{
return Regex.Replace(value, @"{(?<exp>[^}]+)}", match => {
var p = Expression.Parameter(typeof(Job), "job");
var e = System.Linq.Dynamic.DynamicExpression.ParseLambda(new[] { p }, null, match.Groups["exp"].Value);
return (e.Compile().DynamicInvoke(job) ?? "").ToString();
});
}
Run Code Online (Sandbox Code Playgroud)
在我看来,Linq.Expression更强大,所以如果你信任输入字符串,你可以做更多有趣的事情,即:
value = "{job.Name.ToUpper()} job for admin"
return = "TODO job for admin"
Run Code Online (Sandbox Code Playgroud)
Jon*_*lis 10
你不能这样使用字符串插值.但您仍然可以使用前C#6方式来执行此操作string.Format:
static void Main(string[] args)
{
Console.WriteLine(ReplaceMacro("{0} job for admin", new Job { Id = 1, Name = "Todo", Description = "Nothing" }));
Console.ReadLine();
}
static string ReplaceMacro(string value, Job job)
{
return string.Format(value, job.Name);
}
Run Code Online (Sandbox Code Playgroud)
这个通用解决方案扩展了@Dan提供的答案
它可以用于任何类型的对象。
安装 System.Linq.Dynamic
Install-Package System.Linq.Dynamic -Version 1.0.7
string ReplaceMacro(string value, object @object)
{
return Regex.Replace(value, @"{(.+?)}",
match => {
var p = Expression.Parameter(@object.GetType(), @object.GetType().Name);
var e = System.Linq.Dynamic.DynamicExpression.ParseLambda(new[] { p }, null, match.Groups[1].Value);
return (e.Compile().DynamicInvoke(@object) ?? "").ToString();
});
}
Run Code Online (Sandbox Code Playgroud)
查看客户类型的工作演示