Я понимаю, что это не дает прямого ответа на ваш вопрос, но вы можете использовать это вместо метода в вашем примере:
public static bool IsDescendantOf<T>(this object o)
{
if(o == null) throw new ArgumentNullException();
return typeof(T).IsSubclassOf(o.GetType());
}
Так что вы можете использовать это так:
C c = new C();
c.IsDescendantOf<A>();
Также, чтобы ответить на ваш вопрос о разнице между Type.IsSubclassOf и Type.IsAssignableFrom - IsAssignableFrom слабее в том смысле, что если у вас есть два объекта a и b, такие, что это действительно:
a = b;
Тогда typeof(A).IsAssignableFrom(b.GetType())
имеет значение true, поэтому a может быть подклассом b или типом интерфейса.
Напротив, a.GetType().IsSubclassOf(typeof(B))
вернул бы true, только если a был подклассом b. Учитывая имя вашего метода расширения, я бы сказал, что вы должны использовать IsSubclassOf вместо IsAssignable для;