Never use MemberInfo.ReflectedType. ReflectedType is not well defined and so logic which depends on it is also not well defined. Using ReflectedType won’t crash your system but chances are that you’ve got a bug in whatever logic is using ReflectedType. Such logic should be re-factored to use Type.DeclaringType.

Reflected type is defined as “the Type from which the MemberInfo was retrieved”. For example, the following code will print out “Base” and “Derived”.

public class Base { public void Method(); }
public class Derived : Base { }
public class Exe
{
    public static void Main()
    {
        MethodInfo mBase = typeof(Base).GetMethod(“Method”);
        MethodInfo mDerived = typeof(Derived).GetMethod(“Method”);
        Console.WriteLine(mBase.ReflectedType);
        Console.WriteLine(mDerived.ReflectedType);
    }
}

However there are ways other than reflecting on a Type (e.g. GetMethod and friends) to get a hold of a MemberInfo (e.g. via a stalk walk or out of an Exception object) and therefore the semantic of ReflectedType is not well defined.

The root of the problem with the semantic of ReflectedType is that ReflectedType adds an unnecessary dimension to the identity of a MemberInfo. The dimension is unnecessary because MemberInfos that differ only in their ReflectedType (e.g. mBase and mDerived) will otherwise behave exactly the same the same.

We would remove except that would be a breaking change.