2016-10-05 18 views
3

誰もがこれを手伝ってくれますか?動的な文字列補間

必要な出力:私は本当にあなたのReplaceMacro方法のポイントを理解していない

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; } 
} 
+6

基本的にはできません。これは補間された文字列リテラルがどのように機能するかではありません文字列の書式設定(または 'FormattableString'への変換)は直ちに実行されます。 –

+0

文字列の置換を使用して素朴なソリューションを実装するだけでは何も止まっていません。状況によっては、パフォーマンス上の問題があるかもしれないし、そうでないかもしれませんが、*できます*。 –

+0

文字列の独自の解析を行う必要があります。 – juharr

答えて

8

つの提案:

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(); 
    }); 
} 

Linq.Expression

MSDN LINQSamplesで提供ダイナミック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(); 
    }); 
} 

をオペルイニオンは、Linq.Expressionはすなわち、あなたが入力文字列を信頼場合はそう、あなたはもっと面白いことを行うことができ、より強力です。:

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

"$ {job.Name}"の正規表現を更新してください。ありがとう –

+0

パーフェクト。 Daftの事は、私はすでにもっと複雑なものに動的表現を使用していましたが、簡単な変数の代わりに正規表現を使用していましたが、2 + 2を一緒に入れて正規表現を使って複雑な変数名を見つけ出し、それらを置き換えてください... –

+0

ありがとう!、私はこの2日を無駄にしました – habib

0

「管理者ため藤堂ジョブ」...

しかし、ここではそれが動作するはず方法は次のとおりです。

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メソッドは1つのパラメータw HICHは仕事です:

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)); 

か何か。

+0

私は、文字列が設定ファイルから読み込まれ、OPが補間を動的に適用したいと考えていると思います。 – juharr

2

このように文字列補間は使用できません。しかし、あなたはまだstring.Formatを使用してそれを行うには事前にC#6の方法を使用することができます。@ThePerplexedOneから

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); 
} 
+2

文字列の補間は文法的な砂糖だけであり、結果のILでは 'String.Format'がまだ使用されているので、ここではもっと魅力的なことをするのは本当に難しいです。 – decPL

0

回答は良いですが、あなたは本当に文字列補間を避けるために必要がある場合は、その

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

あなたは、あなたに機能を変更する必要があります。

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

そして、それを呼び出す:

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