I saw this question and similar questions and I preferred to use a built-in method for the problem of using a dictionary of values to fill-in placeholders in a template string. Here's my solution, which is built on the StringFormatter class from this thread:
public static void ThrowErrorCodeWithPredefinedMessage(Enums.ErrorCode errorCode, Dictionary<string, object> values)
{
var str = new StringFormatter(MSG.UserErrorMessages[errorCode]) { Parameters = values};
var applicationException = new ApplicationException($"{errorCode}", new ApplicationException($"{str.ToString().Replace("@","")}"));
throw applicationException;
}
where the message exists in a Dictionary that is not in the caller, but the caller only has access to Enums.ErrorCode, and can build an argument array and send it to the above method as argument.
assuming we have the value of MSG.UserErrorMessages[errorCode] is originally
"The following entry exists in the dump but is not found in @FileName: @entryDumpValue"
The result of this call
var messageDictionary = new Dictionary<string, object> {
{ "FileName", sampleEntity.sourceFile.FileName}, {"entryDumpValue", entryDumpValue }
};
ThrowErrorCodeWithPredefinedMessage(Enums.ErrorCode.MissingRefFileEntry, messageDictionary);
is
The following entry exists in the dump but is not found in cellIdRules.ref: CellBand = L09
The only restriction to this approach is to avoid using '@' in the contents of any of the passed values.