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 System.Reflection.Emit namespace. You can extend the metadata for existing types with custom attributes. For more information, see Chapter 14.