public static string FormatWithMacros(this string value, GetMacroValueDelegate getMacroValue, object eachItem = null, GetMacroValueDelegate preprocessValue = null, GetMacroValueDelegate postprocessValue = null) {
if (preprocessValue != null) {
foreach (GetMacroValueDelegate preprocess in preprocessValue.GetInvocationList()) {
value = preprocess(value);
}
}
if (getMacroValue != null) {
value = value.ProcessMacroInternal(getMacroValue, eachItem); // no macro handler?, just return
}
if (postprocessValue != null) {
foreach (GetMacroValueDelegate postprocess in postprocessValue.GetInvocationList()) {
value = postprocess(value);
}
}
return value;
}