This paper presents a language (called Metaphor) for expressing staged programs in a strongly-typed, imperative, object-oriented
environment. The language is based on a subset of C# or Java; it is multi-stage and provides static type checking of later stage code. Object-oriented frameworks usually offer
a type introspection or reflection capability to discover information about types at run-time. Metaphor allows this reflection system to be incorporated into
the language’s staging constructs, thus allowing the generation of code based on the structure of types – a common application
for code generation in these environments. The paper presents the language, gives a formal description of its type system
and discusses a prototype implementation of the language as a compiler targeting the .NET Common Language Runtime.