The last parameter has to be an object[], so you need to wrap the decimal:
foreach (KeyValuePair<string, decimal> update in updates)
{
salesorder.GetType().InvokeMember(update.Key, BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetProperty, Type.DefaultBinder, salesorder, new object[] { update.Value });
}
If you want to set values 'deeper' (as indicated in your comments):
foreach (KeyValuePair<string, decimal> update in updates)
{
var property = salesorder.GetType().InvokeMember(update.Key, BindingFlags.Instance | BindingFlags.Public | BindingFlags.GetProperty, Type.DefaultBinder, salesorder, new object[] { });
property.GetType().InvokeMember("Value", BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetProperty, Type.DefaultBinder, property, new object[] { update.Value });
}