K
Kent Boogaart
*tried this already on the buildingcontrols newsgroup but didn't get a
response*
Hi,
As far as I can tell, it is not possible to use the TypeConverter
infrastructure with generic types. Say you have this type:
public struct Id<T> where T : IComparable
{ ... }
And you want to convert from strings to Id<T> and vice-versa. So you write a
generic TypeConverter:
public IdConverter<T> : TypeConverter
{ ... }
But then you'll find you can't apply the generic type converter:
[TypeConverter(typeof(IdConverter<T>))] //this will not compile
public struct Id<T> where T : IComparable
{ ... }
You can attempt to hack together a solution based on the
ITypeDescriptorContext parameter to the various TypeConverter methods.
However, this is unreliable since this parameter isn't always passed in (and
certainly wasn't by VS.NET when I tried it). As far as I can tell, the
possible workarounds are:
1. Implement a generic type converter and apply it manually to each Id<T>
property instead of applying it only once to the Id<T> struct.
2. Forgo generics and use subclasses, each with their own TypeConverter
applied.
3. Don't use type converters.
Can anyone tell me whether I'm missing something?
Thanks,
Kent
response*
Hi,
As far as I can tell, it is not possible to use the TypeConverter
infrastructure with generic types. Say you have this type:
public struct Id<T> where T : IComparable
{ ... }
And you want to convert from strings to Id<T> and vice-versa. So you write a
generic TypeConverter:
public IdConverter<T> : TypeConverter
{ ... }
But then you'll find you can't apply the generic type converter:
[TypeConverter(typeof(IdConverter<T>))] //this will not compile
public struct Id<T> where T : IComparable
{ ... }
You can attempt to hack together a solution based on the
ITypeDescriptorContext parameter to the various TypeConverter methods.
However, this is unreliable since this parameter isn't always passed in (and
certainly wasn't by VS.NET when I tried it). As far as I can tell, the
possible workarounds are:
1. Implement a generic type converter and apply it manually to each Id<T>
property instead of applying it only once to the Id<T> struct.
2. Forgo generics and use subclasses, each with their own TypeConverter
applied.
3. Don't use type converters.
Can anyone tell me whether I'm missing something?
Thanks,
Kent