动态字符串插值

谁能帮我这个?

必需输出:“ 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; } } 

两个建议:

的DataBinder.Eval

 string ReplaceMacro(string value, Job job) { return Regex.Replace(value, @"{(?[^}]+)}", match => { return (System.Web.UI.DataBinder.Eval(new { Job = job }, match.Groups["exp"].Value) ?? "").ToString(); }); } 

Linq.Expression

使用MSDN LINQSamples中提供的Dynamic Query类:

 string ReplaceMacro(string value, Job job) { return Regex.Replace(value, @"{(?[^}]+)}", 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(); }); } 

在我看来,Linq.Expression更强大,所以如果你信任输入字符串,你可以做更多有趣的事情,即:

 value = "{job.Name.ToUpper()} job for admin" return = "TODO job for admin" 

你不能这样使用字符串插值。 但你仍然可以使用pre-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); } 

您需要命名字符串格式替换。 多年前见Phil Haack的post: http : //haacked.com/archive/2009/01/04/fun-with-named-formats-string-parsing-and-edge-cases.aspx/

来自@ThePerplexedOne的答案更好,但如果你真的需要避免字符串插值,那么

 static string ReplaceMacro(string value, Job job) { return value?.Replace("{job.Name}", job.Name); //Output should be "Todo job for admin" } 

你应该将你的function改为:

 static string ReplaceMacro(Job obj, Func function) { return function(obj); } 

并称之为:

 Console.WriteLine( ReplaceMacro( new Job { Id = 1, Name = "Todo", Description = "Nothing" }, x => $"{x.Name} job for admin")); 

我真的不明白你的ReplaceMacro方法的意义……

但这是它应该如何工作:

 class Program { static void Main(string[] args) { var job = new Job { Id = 1, Name = "Todo", Description = "Nothing" }; Console.WriteLine($"{job.Name} job for admin"); Console.ReadLine(); } } 

但是如果你真的想要它的动态感觉,你的ReplaceMacro方法应该只取一个参数,这是工作:

 static string ReplaceMacro(Job job) { return $"{job.Name} job for admin."; } 

并使用它像:

 var job = new Job { Id = 1, Name = "Todo", Description = "Nothing" }; Console.WriteLine(ReplaceMacro(job)); 

或者那种效果。