ドットネットの反射

最近再びドットネットのAPIに関して読んでいます。
Reflection is an interesting topic, as it enables architectural constructs of code, classes, methods, assemblies, etc. to be examined at a "meta-data" level instead of at the level of a location in memory to be read or written to. For example, an assembly can be read from a file at run-time, and then a Type instance can be loaded from its list of types. Then a MethodInfo object can be instantiated using the type and the name of the method via the "GetMethod" method. Invoke can then be called on this method (passing either an object reference or null for static). To instantiate objects, a "ConstructorInfo" object can be instantiated for the type and Invoke can be called on this.
I am interested to determine what the use of this technique is. I suppose it is useful for executing code that was not available at compile time. In addition, local variables and intermediate language code for a method can be retrieved, which may be useful for debugging a third party library. Reflection also allows intermediate language code to be generated dynamically at run-time using classes such as AssemblyBuilder, TypeBuilder, MethodBuilder, and ILGenerator.