Obviously reflection is a very extensive subject, but let's take a simple example: The "is" operator (A is B). What does it actually require the CLR to do? To look through the assembly's metadata, locate type A, walk up through its inheritance hierarchy and see if B is in there somewhere.
Now, isn't that all standard work for the CLR? I mean, the CLR does type-checking in runtime all the time in non-reflection code. Whenever you're calling methods or assigning values to parameters, the CLR must check in runtime whether the assigned object's type matches its designated parameter or variable.
So what makes reflection (and by that I mean the simple operators, such as "is" or "as"), relatively expensive?