动态字符串插值
谁能帮我这个?
必需输出:“ 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));
或者那种效果。