I think so, though I'm still in the midst of a work in progress. I I've started using the approach of having a Custom WebPart that loads a corresponding User Control, or multiple UserControls but mainly to be able to use the many User Controls I already have while being able to use the full capabilities of WebParts. (I ran into difficulties using User Controls wrapped in generic WebParts when I tried to add the ability to automatically generate Editor Parts for my WebPart from the property definitions using reflection.)
Although this creates some redundancy in setting properties, by default I use reflection to set the properties of the user control by corresponding Property Name and property return type. E.g. from my Base Web Part class:
protected
override void CreateChildControls() {
this.Controls.Clear();
LoadUC(UCpath);
}
protected virtual void LoadUC(string UCPath) {
Control ctrl = this.Parent.Page.LoadControl(UCPath);
ctrl.ID = System.Guid.NewGuid().ToString();
Type ctrlType = ctrl.GetType();
Type thisType = this.GetType();
//All properties of the loaded UserControl which have the same name
//and type are set to the same value of those properties in the webpart.
foreach (PropertyInfo propInfo in thisType.GetProperties()) {
object objectValue = propInfo.GetValue(this,null);
Type propType = propInfo.PropertyType;
PropertyAttributes propAttributes = propInfo.Attributes;
PropertyInfo ctrlPropInfo = ctrlType.GetProperty(propInfo.Name);
if ( ctrlPropInfo != null && ctrlPropInfo.PropertyType == propType && ctrlPropInfo.CanWrite) {
ctrlPropInfo.SetValue(ctrl, objectValue, null);
}
}
this.Controls.Add(ctrl);
}