During teaching of .NET reflection topics, I mention that using reflection, one can get to the private members of types, and even invoke those members dynamically.
I sometimes get the response in the lines of - how is this possible? What's the point of putting something as private if it's exposed through reflection?
The answer to the "dilemma" is that applications usually run with FullTrust permissions, which means they actually can do anything, including poking in other's privates. But, doing reflection requires having the ReflectionPermission permission with an appropriate flag (ReflectionPermissionFlag enumeration) which may not be granted in partial trust scenarios. The flag allows restricting reflection to enumerating public elements only, allowing dynamic invocation of members and more.