An assembly can be used to discover information about the type it contains.
A System.Type object can be used to discover information about its constructors, methods, properties, and fields.
A ConstructorInfo object can be used to create object instances.
A MethodInfo object can be used to invoke methods on a given type.
A PropertyInfo object and a FieldInfo object can be used to manipulate an object's state.
Custom attributes can be defined to extend the metadata of a language element.
Custom attributes can also be used to retrieve extended metadata at runtime.