Types, members, modules, and assemblies all have associated metadata
that is used by all the major CLR services, is considered an
indivisible part of an application, and can be accessed via
reflection (see Chapter 13).
A key characteristic of metadata is it can be extended. Extend the
metadata with custom attributes, which allow you to
"decorate" a code element with
additional information stored in the metadata associated with the
element.
This additional information can then be retrieved at runtime and used
to build services that work declaratively, which is the way that the
CLR implements core features such as serialization and interception.