2 // System.ComponentModel.TypeConverter.cs
5 // Gonzalo Paniagua Javier (gonzalo@ximian.com)
6 // Andreas Nahr (ClassDevelopment@A-SoftTech.com)
8 // (C) 2002/2003 Ximian, Inc (http://www.ximian.com)
9 // (C) 2003 Andreas Nahr
13 // Permission is hereby granted, free of charge, to any person obtaining
14 // a copy of this software and associated documentation files (the
15 // "Software"), to deal in the Software without restriction, including
16 // without limitation the rights to use, copy, modify, merge, publish,
17 // distribute, sublicense, and/or sell copies of the Software, and to
18 // permit persons to whom the Software is furnished to do so, subject to
19 // the following conditions:
21 // The above copyright notice and this permission notice shall be
22 // included in all copies or substantial portions of the Software.
24 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
28 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
29 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
30 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
34 using System
.Collections
;
35 using System
.Globalization
;
36 using System
.Runtime
.InteropServices
;
38 namespace System
.ComponentModel
41 public class TypeConverter
43 public bool CanConvertFrom (Type sourceType
)
45 return CanConvertFrom (null, sourceType
);
48 public virtual bool CanConvertFrom (ITypeDescriptorContext context
, Type sourceType
)
53 public bool CanConvertTo (Type destinationType
)
55 return CanConvertTo (null, destinationType
);
58 public virtual bool CanConvertTo (ITypeDescriptorContext context
, Type destinationType
)
60 return (destinationType
== typeof (string));
63 public object ConvertFrom (object o
)
65 return ConvertFrom (null, CultureInfo
.CurrentCulture
, o
);
68 public virtual object ConvertFrom (ITypeDescriptorContext context
, CultureInfo culture
, object value)
70 throw new NotSupportedException (this.ToString() + " cannot be created from '" +
71 value.GetType().ToString() + "'");
74 public object ConvertFromInvariantString (string text
)
76 return ConvertFromInvariantString (null, text
);
79 public object ConvertFromInvariantString (ITypeDescriptorContext context
, string text
)
81 return ConvertFromString (context
, CultureInfo
.InvariantCulture
, text
);
84 public object ConvertFromString (string text
)
86 return ConvertFrom (text
);
89 public object ConvertFromString (ITypeDescriptorContext context
, string text
)
91 return ConvertFromString (context
, CultureInfo
.CurrentCulture
, text
);
94 public object ConvertFromString (ITypeDescriptorContext context
, CultureInfo culture
, string text
)
96 return ConvertFrom (context
, culture
, text
);
99 public object ConvertTo (object value, Type destinationType
)
101 return ConvertTo (null, null, value, destinationType
);
104 public virtual object ConvertTo (ITypeDescriptorContext context
, CultureInfo culture
, object value,
105 Type destinationType
)
108 if (destinationType
== null)
109 throw new ArgumentNullException ("destinationType");
111 if (destinationType
== typeof (string)) {
113 return value.ToString();
117 throw new NotSupportedException ("Conversion not supported");
120 public string ConvertToInvariantString (object value)
122 return ConvertToInvariantString (null, value);
125 public string ConvertToInvariantString (ITypeDescriptorContext context
, object value)
127 return (string) ConvertTo (context
, CultureInfo
.InvariantCulture
, value, typeof (string));
130 public string ConvertToString (object value)
132 return (string) ConvertTo (null, CultureInfo
.CurrentCulture
, value, typeof (string));
135 public string ConvertToString (ITypeDescriptorContext context
, object value)
137 return (string) ConvertTo (context
, CultureInfo
.CurrentCulture
, value, typeof (string));
140 public string ConvertToString (ITypeDescriptorContext context
, CultureInfo culture
, object value)
142 return (string) ConvertTo (context
, culture
, value, typeof (string));
145 protected Exception
GetConvertFromException (object value)
147 throw new NotSupportedException (this.ToString() + " cannot convert from '" +
148 value.GetType().ToString() + "'");
151 protected Exception
GetConvertToException (object value, Type destinationType
)
153 throw new NotSupportedException (this.ToString() + " cannot convert from '" +
154 value.GetType().ToString() + "' to '" + destinationType
.ToString() + "'");
157 public object CreateInstance (IDictionary propertyValues
)
159 return CreateInstance (null, propertyValues
);
162 public virtual object CreateInstance (ITypeDescriptorContext context
, IDictionary propertyValues
)
167 public bool GetCreateInstanceSupported ()
169 return GetCreateInstanceSupported (null);
172 public virtual bool GetCreateInstanceSupported (ITypeDescriptorContext context
)
177 public PropertyDescriptorCollection
GetProperties (object value)
179 return GetProperties (null, value);
182 public PropertyDescriptorCollection
GetProperties (ITypeDescriptorContext context
, object value)
184 return GetProperties (context
, value, null);
187 public virtual PropertyDescriptorCollection
GetProperties (ITypeDescriptorContext context
,
188 object value, Attribute
[] attributes
)
193 public bool GetPropertiesSupported ()
195 return GetPropertiesSupported (null);
198 public virtual bool GetPropertiesSupported (ITypeDescriptorContext context
)
203 public ICollection
GetStandardValues ()
205 return GetStandardValues (null);
208 public virtual StandardValuesCollection
GetStandardValues (ITypeDescriptorContext context
)
213 public bool GetStandardValuesExclusive ()
215 return GetStandardValuesExclusive (null);
218 public virtual bool GetStandardValuesExclusive (ITypeDescriptorContext context
)
223 public bool GetStandardValuesSupported ()
225 return GetStandardValuesSupported (null);
228 public virtual bool GetStandardValuesSupported (ITypeDescriptorContext context
)
233 public bool IsValid (object value)
235 return IsValid (null, value);
238 public virtual bool IsValid (ITypeDescriptorContext context
, object value)
243 protected PropertyDescriptorCollection
SortProperties (PropertyDescriptorCollection props
, string[] names
)
249 public class StandardValuesCollection
: ICollection
, IEnumerable
251 private ICollection values
;
253 public StandardValuesCollection (ICollection values
)
255 this.values
= values
;
258 public void CopyTo (Array array
, int index
)
260 values
.CopyTo (array
, index
);
263 public IEnumerator
GetEnumerator ()
265 return values
.GetEnumerator ();
268 bool ICollection
.IsSynchronized
{
269 get { return false; }
272 object ICollection
.SyncRoot
{
276 int ICollection
.Count
{
277 get { return this.Count; }
281 get { return values.Count; }
284 public object this [int index
] {
285 get { return ((IList) values) [index]; }
289 protected abstract class SimplePropertyDescriptor
: PropertyDescriptor
291 private Type componentType
;
292 private Type propertyType
;
294 public SimplePropertyDescriptor (Type componentType
,
297 this (componentType
, name
, propertyType
, null)
301 public SimplePropertyDescriptor (Type componentType
,
304 Attribute
[] attributes
) : base (name
, attributes
)
306 this.componentType
= componentType
;
307 this.propertyType
= propertyType
;
310 public override Type ComponentType
{
311 get { return componentType; }
314 public override Type PropertyType
{
315 get { return propertyType; }
318 public override bool IsReadOnly
{
319 get { return Attributes.Contains (ReadOnlyAttribute.Yes); }
322 public override bool ShouldSerializeValue (object component
)
327 public override bool CanResetValue (object component
)
329 DefaultValueAttribute Attrib
= ((DefaultValueAttribute
) Attributes
[typeof (DefaultValueAttribute
)]);
330 if (Attrib
== null) {
333 return (Attrib
.Value
== GetValue (component
));
336 public override void ResetValue (object component
)
338 DefaultValueAttribute Attrib
= ((DefaultValueAttribute
) Attributes
[typeof (DefaultValueAttribute
)]);
339 if (Attrib
!= null) {
340 SetValue (component
, Attrib
.Value
);