TypeConverter for object type Properties

  • Thread starter Thread starter Jeronimo Bertran
  • Start date Start date
J

Jeronimo Bertran

I have a property with a member of type object. I am showing the value of
this property in a PropertyGrid but depending on the type of the object I
want to use the correspondant TypeConverter. Here is an example of what I
mean:

public byte[] Test
{
get { return new byte[100]; }
}

public object Test2
{
get { return new byte[100]; }
}

If I have both properties in a property grid, Test will be shown as an
expandable item with the text "Byte[] Array".. if I expand the item I will
be able to see all of the elements in the array. However, Test2 will only
show the text "System.Byte[]" and I will have no way of reading the
elements of the array.

Of course the property of type object will not always contain a byte[].

How can I provide the standard functionality for each type?

Thanks
 
Hi,

You could set a special TypeConverter which would delegate the work to
the real TypeConverter of the property. When the value is passed in
argument, this is easy. But when only a context is passed, you will
only have the context.Instance property to get the information,
meaning that you will have to cast the instance to its real type to
get access to your property. Here is an example. Note that you could
cache the returned converter instead of requesting it every time:

public class ObjectConverter : TypeConverter
{
public override bool GetPropertiesSupported(ITypeDescriptorContext
context)
{
TypeConverter t =
TypeDescriptor.GetConverter(((MyContainer)context.Instance).MyProperty);
if (t != null)
return t.GetPropertiesSupported(context);

return base.GetPropertiesSupported(context);
}

public override PropertyDescriptorCollection
GetProperties(ITypeDescriptorContext context, object value,
Attribute[] attributes)
{
TypeConverter t = TypeDescriptor.GetConverter(value);
if (t != null)
return t.GetProperties(context, value, attributes);

return base.GetProperties(context, value, attributes);
}
}

Hope this helps. And anyway this is some stuff that you can experiment
with.

Best regards,

Nicolas Cadilhac @ VisualHint (http://www.visualhint.com)
Home of Smart PropertyGrid for .Net and MFC (http://www.visualhint.com/
index.php/propertygrid)
Microsoft PropertyGrid Resource List - http://www.propertygridresourcelist.com
Home of Smart FieldPackEditor.Net / DateTimePicker replacement (http://
www.visualhint.com/index.php/fieldpackeditor)
 
oops, no need to be aware of the container class. Here is how to get
the value:

object value = context.PropertyDescriptor.GetValue(context.Instance);
TypeConverter t = TypeDescriptor.GetConverter(value);

Best regards,

Nicolas Cadilhac @ VisualHint (http://www.visualhint.com)
Home of Smart PropertyGrid for .Net and MFC (http://www.visualhint.com/
index.php/propertygrid)
Microsoft PropertyGrid Resource List - http://www.propertygridresourcelist.com
Home of Smart FieldPackEditor.Net / DateTimePicker replacement (http://
www.visualhint.com/index.php/fieldpackeditor)


Hi,

You could set a special TypeConverter which would delegate the work to
the real TypeConverter of the property. When the value is passed in
argument, this is easy. But when only a context is passed, you will
only have the context.Instance property to get the information,
meaning that you will have to cast the instance to its real type to
get access to your property. Here is an example. Note that you could
cache the returned converter instead of requesting it every time:

public class ObjectConverter : TypeConverter
{
public override bool GetPropertiesSupported(ITypeDescriptorContext
context)
{
TypeConverter t =
TypeDescriptor.GetConverter(((MyContainer)context.Instance).MyProperty);
if (t != null)
return t.GetPropertiesSupported(context);

return base.GetPropertiesSupported(context);
}

public override PropertyDescriptorCollection
GetProperties(ITypeDescriptorContext context, object value,
Attribute[] attributes)
{
TypeConverter t = TypeDescriptor.GetConverter(value);
if (t != null)
return t.GetProperties(context, value, attributes);

return base.GetProperties(context, value, attributes);
}

}

Hope this helps. And anyway this is some stuff that you can experiment
with.

Best regards,

Nicolas Cadilhac @ VisualHint (http://www.visualhint.com)
Home of Smart PropertyGrid for .Net and MFC (http://www.visualhint.com/
index.php/propertygrid)
Microsoft PropertyGrid Resource List -http://www.propertygridresourcelist.com
Home of Smart FieldPackEditor.Net / DateTimePicker replacement (http://www.visualhint.com/index.php/fieldpackeditor)

I have a property with a member of type object. I am showing the value of
this property in aPropertyGridbut depending on the type of the object I
want to use the correspondant TypeConverter. Here is an example of what I
mean:
public byte[] Test
{
get { return new byte[100]; }
}
public object Test2
{
get { return new byte[100]; }
}
If I have both properties in a property grid, Test will be shown as an
expandable item with the text "Byte[] Array".. if I expand the item I will
be able to see all of the elements in the array. However, Test2 will only
show the text "System.Byte[]" and I will have no way of reading the
elements of the array.
Of course the property of type object will not always contain a byte[].
How can I provide the standard functionality for each type?
 
Back
Top