Add a pseudo-covariant version of Resolve() to MemberReference. The Resolve() in MemberReference returns a IMemberDefinition and is implemented by ResolveImpl. Each subclass can override ResolveImpl to change the behavior. In addition, each subclass implements a new method which returns the specific *Definition type and hides the Resolve() method in MemberReference. If you call Resolve() as a {Event,Field,Method,Property,Type}Reference, you get the appropriate type, but if you call it as a MemberReference, you get a IMemberDefinition.