Reflection is the programmatic act of reading the metadata associated with a type.
Reflection is most useful in conjunction with attributes, which are a way of adding information to a type and affecting the type’s behavior.
It allows you to define new types during runtime and emit the corresponding IL code and metadata (using the services found in the System.Reflection.Emit namespace