متود زیر برای تولید عبارت مبتنی بر الگو زمانی که الگو پیچیدهتر از این است که بشود با string.Format به راحتی پیاده سازی شود ولی چندان هم پیچیده نیست که ابزارهای حرفه ایتری مانند T4 یا Razor به کار بیایند، میتواند مورد استفاده قرار گیرد:
/// <summary>
/// Insert values from an object into a string pattern. To specify the object's property you have to use the '{propertyName}'.
/// </summary>
/// <remarks>
/// This method is a replacement to String.Format, but it has two differences:
/// <list type="simple">
/// <item>It reverese the order you call the functionality, instead of writing String.Format(pattern, args) you write pattern.FillByObject(args). This makes the code look cleaner.</item>
/// <item>You supply the pattern with an object and specify insertion points by property names.</item>
/// </list>
/// <example>
/// <![CDATA[
/// "First name:{firstName}, Sur name:{Surname}".FillByObject(new {firstName = "Sam", lastName="Naseri"});
/// ]]>
/// </example>
/// </remarks>
/// <seealso cref="Fill"/>
/// <typeparam name="T">Type of bindingValue.</typeparam>
/// <param name="bindingPattern">The pattern to fill.</param>
/// <param name="bindingValue">The object providing values to fill in the pattern.</param>
/// <returns>The pattern filled with values.</returns>
public static string FillByObject<T>(this string bindingPattern, T bindingValue)
{
var properties = GetProperties(typeof(T)).ToList();
var values = properties.Select(property => property.GetValue(bindingValue, new object[] { })).ToList();
var result = bindingPattern;
for (int index = 0; index < properties.Count; index++)
{
var property = properties[index];
var propPattern = "{" + property.Name + "}";
var old = result;
result = result.Replace(propPattern, values[index] != null ? values[index].ToString() : "");
}
return result;
}
پیاده سازی فوق یک پیاده سازی بسیار خام و بسیار کند است و جای بهبود زیادی دارد. من فقط برای سناریوهای ساده که کارایی مطرح نیست استفاده از متود فوق را توصیه میکنم.
متودهای جانبی مورد نیاز:
private static IEnumerable<PropertyInfo> GetProperties(Type t)
{
return t.GetProperties(BindingFlags.Public | BindingFlags.Instance);
}
همچنین متود زیر هم میتواند نوشتن string.Format را یک خرده سادهتر کند:
/// <summary>
/// A simple replacement for String.Format which only makes the codes look nicer.
/// </summary>
/// <param name="pattern">The source string that you want to replace insertion points on it.</param>
/// <param name="args">Values to be replaced in the pattern.</param>
/// <returns></returns>
public static string Fill(this string pattern, params object[] args)
{
return string.Format(pattern, args);
}