动态字符串插值

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)

  • 那些寻找 .NET Core 版本的人可以利用 [System.Linq.Dynamic.Core](https://github.com/StefH/System.Linq.Dynamic.Core) 库。然后,ParseLambda 行必须更改为:`var e = System.Linq.Dynamic.Core.DynamicExpressionParser.ParseLambda(new[] { p }, null, match.Groups["exp"].Value);` (5认同)

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)

  • 由于字符串插值只是语法糖而且`String.Format`仍在结果IL中使用,所以在这里做任何更奇特的事情真的很难. (5认同)

M.H*_*san 5

这个通用解决方案扩展了@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)

查看客户类型的工作演示