Mercurial > pub > bltoolkit
diff Source/ComponentModel/TypeTypeConverter.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Source/ComponentModel/TypeTypeConverter.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,139 @@ +using System; +using System.ComponentModel; +using System.Globalization; +using System.ComponentModel.Design; + +namespace BLToolkit.ComponentModel +{ + /// <summary> + /// Converts the value of an object into a <see cref="System.Type"/>. + /// </summary> + public class TypeTypeConverter: TypeConverter + { + // Human readable text for 'nothing selected'. + // + private const string NoType = "(none)"; + + /// <summary> + /// Returns whether this converter can convert an object of the given type to + /// a <see cref="System.Type"/>, using the specified context. + /// </summary> + /// <param name="context">An <see cref="System.ComponentModel.ITypeDescriptorContext"/> + /// that provides a format context. </param> + /// <param name="sourceType">A <see cref="System.Type"/> that represents the type + /// you want to convert from. </param> + /// <returns> + /// <see langword="true"/> if this converter can perform the conversion; + /// otherwise, <see langword="false"/>. + /// </returns> + public override bool CanConvertFrom( + ITypeDescriptorContext context, + Type sourceType) + { + return sourceType == typeof(string) || + base.CanConvertFrom(context, sourceType); + } + + /// <summary> + /// Converts the given object to the corresponding <see cref="System.Type"/>, + /// using the specified context and culture information. + /// </summary> + /// <param name="culture">The <see cref="System.Globalization.CultureInfo"/> to + /// use as the current culture. </param> + /// <param name="context">An + /// <see cref="System.ComponentModel.ITypeDescriptorContext"/> that provides a + /// format context. </param> + /// <param name="value">The <see cref="System.Object"/> to convert. </param> + /// <returns> + /// An <see cref="System.Object"/> that represents the converted value. + /// </returns> + /// <exception cref="System.NotSupportedException">The conversion cannot be + /// performed. </exception> + public override object ConvertFrom( + ITypeDescriptorContext context, + CultureInfo culture, + object value) + { + if (value == null) + return null; + + if (!(value is string)) + return base.ConvertFrom(context, culture, value); + + string str = (string)value; + + if (str.Length == 0 || str == NoType) + return null; + + // Try VisualStudio own service first. + // + ITypeResolutionService typeResolver = + (ITypeResolutionService)context.GetService(typeof(ITypeResolutionService)); + + if (typeResolver != null) + { + Type type = typeResolver.GetType(str); + + if (type != null) + return type; + } + + return Type.GetType(str); + } + + /// <summary> + /// Returns whether this converter can convert the object to the specified type, + /// using the specified context. + /// </summary> + /// <param name="context">An + /// <see cref="System.ComponentModel.ITypeDescriptorContext"/> that provides + /// a format context. </param> + /// <param name="destinationType">A <see cref="System.Type"/> that represents + /// the type you want to convert to. </param> + /// <returns> + /// <see langword="true"/> if this converter can perform the conversion; + /// otherwise, <see langword="false"/>. + /// </returns> + public override bool CanConvertTo( + ITypeDescriptorContext context, + Type destinationType) + { + return destinationType == typeof(string) || + base.CanConvertTo(context, destinationType); + } + + /// <summary> + /// Converts the given value object to the specified type, using the specified + /// context and culture information. + /// </summary> + /// <param name="culture">A <see cref="System.Globalization.CultureInfo"/>. + /// If null is passed, the current culture is assumed. </param> + /// <param name="context">An + /// <see cref="System.ComponentModel.ITypeDescriptorContext"/> that provides + /// a format context. </param> + /// <param name="destinationType">The <see cref="System.Type"/> to convert + /// the value parameter to. </param> + /// <param name="value">The <see cref="System.Object"/> to convert. </param> + /// <returns> + /// An <see cref="System.Object"/> that represents the converted value. + /// </returns> + /// <exception cref="System.NotSupportedException">The conversion cannot be + /// performed. </exception> + /// <exception cref="System.ArgumentNullException"> + /// The <paramref name="destinationType"/> parameter is null. </exception> + public override object ConvertTo( + ITypeDescriptorContext context, + CultureInfo culture, + object value, + Type destinationType) + { + if (destinationType != typeof(string)) + return base.ConvertTo(context, culture, value, destinationType); + + if (value == null || value.ToString().Length == 0) + return NoType; + + return value.ToString(); + } + } +}