internal TypeConverter GetConverter(object instance)
{
TypeConverterAttribute typeAttr = null;
// For instances, the design time object for them may want to redefine the
// attributes. So, we search the attribute here based on the instance. If found,
// we then search on the same attribute based on type. If the two don't match, then
// we cannot cache the value and must re-create every time. It is rare for a designer
// to override these attributes, so we want to be smart here.
//
if (instance != null)
{
typeAttr = (TypeConverterAttribute)TypeDescriptor.GetAttributes(_type)[typeof(TypeConverterAttribute)];
TypeConverterAttribute instanceAttr = (TypeConverterAttribute)TypeDescriptor.GetAttributes(instance)[typeof(TypeConverterAttribute)];
if (typeAttr != instanceAttr)
{
Type converterType = GetTypeFromName(instanceAttr.ConverterTypeName);
if (converterType != null && typeof(TypeConverter).GetTypeInfo().IsAssignableFrom(converterType))
{
return (TypeConverter)ReflectTypeDescriptionProvider.CreateInstance(converterType, _type);
}
}
}
// If we got here, we return our type-based converter.
//
if (_converter == null)
{
if (typeAttr == null)
{
typeAttr = (TypeConverterAttribute)TypeDescriptor.GetAttributes(_type)[typeof(TypeConverterAttribute)];
}
if (typeAttr != null)
{
Type converterType = GetTypeFromName(typeAttr.ConverterTypeName);
if (converterType != null && typeof(TypeConverter).GetTypeInfo().IsAssignableFrom(converterType))
{
_converter = (TypeConverter)ReflectTypeDescriptionProvider.CreateInstance(converterType, _type);
}
}
if (_converter == null)
{
// We did not get a converter. Traverse up the base class chain until
// we find one in the stock hashtable.
//
_converter = (TypeConverter)ReflectTypeDescriptionProvider.SearchIntrinsicTable(IntrinsicTypeConverters, _type);
Debug.Assert(_converter != null, "There is no intrinsic setup in the hashtable for the Object type");
}
}
return _converter;
}