Smart.Format("{Name} from {Address.City}, {Address.State}", user)
// The user object should at least be like that
public class User
{
public string Name { get; set; }
public Address Address { get; set; }
}
public class Address
{
public string City { get; set; }
public string State { get; set; }
}
Hello, \{\{Customer.Name}}
\{\{#newline}}
\{\{#newline}}
\{\{#with Order}}
\{\{#if LineItems}}
Here is a summary of your previous order:
\{\{#newline}}
\{\{#newline}}
\{\{#each LineItems}}
\{\{ProductName}}: \{\{UnitPrice:C}} x \{\{Quantity}}
\{\{#newline}}
\{\{/each}}
\{\{#newline}}
Your total was \{\{Total:C}}.
\{\{#else}}
You do not have any recent purchases.
\{\{/if}}
\{\{/with}}
var sb = new StringBuilder();
sb.AppendFormat("Her name is {0} ", "Lisa");
sb.AppendFormat("and she's {0} years old", "10");
// You can add more lines
string result = sb.ToString();
public class ParameterizedString
{
private string _BaseString;
private Dictionary<string, string> _Parameters;
public ParameterizedString(string baseString)
{
_BaseString = baseString;
_Parameters = new Dictionary<string, string>();
}
public bool AddParameter(string name, string value)
{
if(_Parameters.ContainsKey(name))
{
return false;
}
_Parameters.Add(name, value);
return true;
}
public override string ToString()
{
var sb = new StringBuilder(_BaseString);
foreach (var key in _Parameters.Keys)
{
sb.Replace(key, _Parameters[key]);
}
return sb.ToString();
}
}
Note that this example does not force any parameter name convention. This means that you should be very careful picking your parameters names otherwise you might end up replacing parts of the string you didn't intend to.
var str = "Her name is @name and she's @age years old";
var parameters = new Dictionary<string, object>();
parameters.Add("@name", "Lisa");
parameters.Add("@age", 10);
str = parameters.Aggregate(str, (current, parameter)=> current.Replace(parameter.Key, parameter.Value.ToString()));
If you want something matching the specific syntax in the question you can put together a pretty simple class based on Aggregate:
public class StringFormatter{
public string Str {get;set;}
public Dictionary<string, object> Parameters {get;set;}
public StringFormatter(string p_str){
Str = p_str;
Parameters = new Dictionary<string, object>();
}
public void Add(string key, object val){
Parameters.Add(key, val);
}
public override string ToString(){
return Parameters.Aggregate(Str, (current, parameter)=> current.Replace(parameter.Key, parameter.Value.ToString()));
}
}
适用范围:
var str = new StringFormatter("Her name is @name and she's @age years old");
str.Add("@name", "Lisa");
str.Add("@age", 10);
Console.WriteLine(str);