I have found the solution. Apparently, any object that requires a Dispatcher inherits from the DependencyObject class. This allows for the same pattern as above, only using DependencyObject instead of ISynchronizeInvoke, and CheckAccess() method instead of InvokeRequired property.
if (MarshalledEvent != null) {
foreach (Delegate d in MarshalledEvent.GetInvocationList()) {
if (d.Target is DependencyObject && ((DependencyObject)d.Target).Dispatcher.CheckAccess() == false)
((DependencyObject)d.Target).Dispatcher.Invoke(d, new object[] { this, EventArgs.Empty });
else
d.DynamicInvoke(this, EventArgs.Empty);
}
}