On the concept of interface phasing.
It is imperative that objects and at a higher level, an Application, can change the way they interact by who or what is accessing them.
An object should present itself differently to different audiences. Imagine a developer seeing a specific interface, but not a user, or IDE vs developer. Its not role based, because it could be different per application to application communication, although a similar effect can be achieved.
If my interface is in phase with yours (even to a certain percentage point), then we can communicate, else we must wait until its in phase or find another object to communicate. The concept is simple.
Create automatic and dynamic proxy layers based on metadata and intention of communication. The code is then 'assembled' and made ready for the communication. The code is assembled from existing non contextual code that can fit into a common proxy container and interact.
For example, Duck typing would render communication in a certain level of phasing, depending on the amount of functions that are valid, where as an explicit phasing can be achieved by current interface contracts.
Here lies further possibilities:
A plethora of control over objects, as well as phasing conditions, restraints and possibilities, for example, such as whether a function is 'Published', 'Live', 'AliasFor', 'MappingTo', 'Redirection', and things like
Lack of MetaData on code and .NET Framework libraries