User262162700 posted
Using an ExpressionBuilder it's possible to achieve the above. Bear In mind it's normally better to localize
entire strings as opposed to constructed strings - for my situation though this would suffice.
Here's The ExpressionBuilder
public class ErrorExpressionBuilder : ExpressionBuilder
{
// Create a method that will return the result
// set for the expression argument.
public static object GetErrorMessage(string expression, Type target, string entry)
{
string[] args = expression.Split(',');
string[] parm = new string[args.Length-1];
ResourceManager Glossary = Resources.Glossary.ResourceManager;
ResourceManager ErrorMessages = Resources.ErrorMessage.ResourceManager;
for (int i = 1; i < args.Length; i++)
{
parm[i - 1] = Glossary.GetString(args[i].Trim(), System.Threading.Thread.CurrentThread.CurrentCulture);
}
string msg = ErrorMessages.GetString(args[0].Trim(),System.Threading.Thread.CurrentThread.CurrentCulture);
return String.Format(msg, parm);
}
public override object EvaluateExpression(object target, BoundPropertyEntry entry,
object parsedData, ExpressionBuilderContext context)
{
return GetErrorMessage(entry.Expression, target.GetType(), entry.Name);
}
public override CodeExpression GetCodeExpression(BoundPropertyEntry entry,
object parsedData, ExpressionBuilderContext context)
{
// CodeExpression Generation Parameters
Type propertyType = entry.DeclaringType;
PropertyDescriptor descriptor = TypeDescriptor.GetProperties(propertyType)[entry.PropertyInfo.Name];
CodeExpression[] expressionArray = new CodeExpression[2];
// Generate The Method Call To Resolve The Expression
expressionArray[0] = new CodePrimitiveExpression(entry.Expression.Trim());
expressionArray[1] = new CodeTypeOfExpression(propertyType);
expressionArray[2] = new CodePrimitiveExpression(entry.Name);
return new CodeCastExpression(descriptor.PropertyType, new CodeMethodInvokeExpression(new
CodeTypeReferenceExpression(base.GetType()), "GetErrorMessage", expressionArray));
}
public override bool SupportsEvaluate
{
get { return true; }
}
}