private IList GetWrappedExtenders(IExtenderProvider provider) {
Debug.WriteLineIf(CompDescrSwitch.TraceVerbose, "GetWrappedExtenders");
if (wrappedExtenderTable == null) {
wrappedExtenderTable = new Hashtable();
}
if (provider == null) {
return null;
}
Type providerType = ((object)provider).GetType();
if (!componentType.IsAssignableFrom(providerType)) {
throw new ArgumentException(SR.GetString(SR.ErrorBadExtenderType, providerType.Name, componentType.Name), "provider");
}
bool sitedProvider = false;
if (provider is IComponent && ((IComponent)provider).Site != null) {
sitedProvider = true;
}
IList wrappedExtenders = null;
lock(this) {
wrappedExtenders = (IList) wrappedExtenderTable[provider];
if (wrappedExtenders == null) {
Debug.WriteLineIf(CompDescrSwitch.TraceVerbose, "\tentry not found in table... creating");
IList extenders = GetExtenders();
Debug.WriteLineIf(CompDescrSwitch.TraceVerbose, "\tfound " + extenders.Count.ToString(CultureInfo.InvariantCulture) + " extenders");
wrappedExtenders = new ArrayList(extenders.Count);
for (int i = 0; i < extenders.Count; i++) {
DebugReflectPropertyDescriptor ex = (DebugReflectPropertyDescriptor)extenders[i];
Attribute[] attrs = null;
// If the extender provider is not a sited component, then mark all
// of its properties as design time only, since there is no way we
// can persist them. We can assume this because this is only called if
// we could get the extender provider list from a component site.
//
if (!sitedProvider) {
attrs = new Attribute[] {DesignOnlyAttribute.Yes};
}
wrappedExtenders.Add(new DebugExtendedPropertyDescriptor(ex, ex.ExtenderGetReceiverType(), provider, attrs));
}
wrappedExtenderTable[provider] = wrappedExtenders;
}
else {
Debug.WriteLineIf(CompDescrSwitch.TraceVerbose, "\tentry found in table...");
}
}
return wrappedExtenders;
}