// Somewhere in a component, where this game object and all child game objects should have a message passed:

this.BroadcastTypedMessage(
    (SampleComponent c) => c.FooNoParams);

this.BroadcastTypedMessage(
    (SampleComponent c) => c.FooParam,
    true);

// The compiler can figure out the generic types necessary and extracts the message's name from the given MethodInfo.
// The generic types are strict enough that you can't even pass in the wrong type of parameter! This is a whole lot safer for refactoring.
// Because this is static typed, intellisense also works perfectly.

// I'm not sure if all expression trees given will be the same. It might need to be generalized for more exotic usage.