Catch Exception and rethrow with a new message preserving actual type
<p>I have to <code>catch (Exception ex)</code>, change its message, and then rethrow it.</p>

<p>If I <code>throw new Exception(newMessage, ex);</code>, then I lose the runtime type of the exception, right?</p>

<p>If I <code>throw;</code>, then I can keep the runtime type but the message doesn't change.</p>

<p>Since I'm catching, I don't know what derived type <code>ex</code> may be, so I can't construct the proper type.</p>

<p>And of course, if I <code>throw ex;</code> I lose the stack trace.</p>

<p>Is there a way to reformat the message of <code>ex</code> and rethrow it without losing stack or runtime type information, without resorting to any weird brittle reflection hacks?</p>