If I understand your problem correctly, then you need to:
- Subclass WebContainer by creating a new Class and setting its Super to WebContainer. Let's call it: MyBaseContainer
- Add your property to MyBaseContainer.
- Make all existing WebContainers that need this property children of MyBaseContainer (i.e. set their Super to MyBaseContainer).
- Delete the property from the child containers. They now inherit it from MyBaseContainer.
- Now define Foo() in MyBaseContainer. If there is only one variation of Foo() then the code goes in MyBaseContainer.Foo(). If each child of MyBaseContainer needs to implement its own Foo() then define Foo() in MyBaseContainer as an empty method with the parameters/return expected, and code Foo() in each subclass. You can mix and match. A default Foo() can exist in MyBaseContainer and a few subclasses can override MyBaseContainer.Foo() (replace behavior) and even call it themselves using Super.Foo() thereby adding behavior.
Now forget Introspection. Loop through your page controls and test (IsA) for MyBaseContainer. Children of MyBaseContainer will test TRUE. If you have a MyBaseContainer, cast the type, check the property directly, and call Foo() directly as needed. This will be faster than Introspection.
Side note: another solution would be to define an interface that any class can implement. You can IsA for an interface, cast to an interface, and call methods defined in the interface. But you would also have to define accessor methods for your property in this case since a Class Interface cannot define properties, only methods.