Many of the services available in .NET and exposed via C# (such as late
binding, serialization, remoting, attributes, etc.) depend on the presence
of metadata. Your own programs can also take advantage of this metadata, and
even extend it with new information. Examining existing types via their metadata
is called reflection, and is done using a rich set of
types in the
System.Reflection namespace. It is also possible
to dynamically create new types at runtime via the classes in the
You can extend the metadata for existing types with custom attributes. For
more information, see Chapter 14.
Reflection involves traversing and manipulating an object model that represents an application, including all its compile-time and runtime elements. Consequently, it is important to understand the various logical units of a .NET application and their roles and relationships.
The fundamental units of an application are its types, which contain
members and nested types. Types are contained in modules, which are composed
into assemblies. All these elements are described with metadata. Metadata
is generally produced by the compiler at compile time, although it may also
be created on the fly via
Reflection.Emit (which is described
in Section 13.8).
At runtime, these elements are all contained within an
AppDomain isn’t described with metadata, yet it plays an important role in reflection because it forms a logical process ...