Nice post! Ultimately, what these component frameworks do is what dynamic languages like Python or Smalltalk have always done naturally: Being able to add and remove attributes to an object at runtime, which is nothing more than a glorified dictionary.
Anyway, have you thought to use function pointers/delegates, in order to connect components with properties, without having to do a string lookup and a cast every time you access one? Let me show what I mean with some C#:
class RenderingComponentInputs{ public Func<Vec3> PositionGetter;}class RenderingComponentOutputs{}class RenderingComponent:Component{ public RenderingComponentInputs In=new RenderingComponentInputs(); public RenderingComponentOutputs Out=new RenderingComponentOutputs();}class PhysicsComponentInputs{ public Func<Vec3> PositionGetter;}class PhysicsComponentOutputs{ public Action<Vec3> PositionSetter;}class PhysicsComponent:Component{ public PhysicsComponentInputs In=new PhysicsComponentInputs(); public PhysicsComponentOutputs Out=new PhysicsComponentOutputs();}...static void CreateEntity(){ Entity ent=new Entity(); ent.AddProperty<Vec3>("Position"); PhysicsComponent phys=new PhysicsComponent(); phys.In.PositionGetter=()=>ent.GetProperty<Vec3>("Position"); phys.Out.PositionSetter=(value)=>ent.SetProperty<Vec3>("Position",value); RenderingComponent rend=new RenderingComponent(); rend.In.PositionGetter=()=>ent.GetProperty<Vec3>("Position"); ent.RegisterComponent(phys); ent.RegisterComponent(rend);}...
I think if you create some PropertyDescriptor class(or use the ones provided if you're using C#) which creates direct setters and getters to the property, you can bypass the string lookup completely. Something like:
PropertyDescriptor positionProp=ent.GetPropertyDescr("Position");
phys.Out.PositionGetter=(value)=>positionProp.SetValue<Vec3>(value);
Also, this way you can plugin outputs and inputs in your GUI designer, and can detect dependencies so you update components in the right order.