private unsafe void OnGetTypeConverterAndTypeEditor(Com2PropertyDescriptor sender, GetTypeConverterAndTypeEditorEvent gveevent)
        {
            object target = sender.TargetObject;

            if (target is VSSDK.IProvidePropertyBuilder propBuilder)
            {
                string           guidString  = null;
                VSSDK.CTLBLDTYPE pctlBldType = 0;
                if (GetBuilderGuidString(propBuilder, sender.DISPID, ref guidString, &pctlBldType))
                {
                    gveevent.TypeEditor = new Com2PropertyBuilderUITypeEditor(sender, guidString, pctlBldType, (UITypeEditor)gveevent.TypeEditor);
                }
            }
        }
 private unsafe void OnGetBaseAttributes(Com2PropertyDescriptor sender, GetAttributesEvent attrEvent)
 {
     if (sender.TargetObject is VSSDK.IProvidePropertyBuilder target)
     {
         string           s            = null;
         VSSDK.CTLBLDTYPE bldrType     = 0;
         bool             builderValid = GetBuilderGuidString(target, sender.DISPID, ref s, &bldrType);
         // we hide IDispatch props by default, we we need to force showing them here
         if (sender.CanShow && builderValid)
         {
             if (typeof(Oleaut32.IDispatch).IsAssignableFrom(sender.PropertyType))
             {
                 attrEvent.Add(BrowsableAttribute.Yes);
             }
         }
     }
 }
 public Com2PropertyBuilderUITypeEditor(Com2PropertyDescriptor pd, string guidString, VSSDK.CTLBLDTYPE type, UITypeEditor baseEditor) : base(baseEditor)
 {
     propDesc        = pd;
     this.guidString = guidString;
     bldrType        = type;
 }