TypeConverterHelper.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ DotNET / DotNET / 8.0 / untmp / WIN_WINDOWS / lh_tools_devdiv_wpf / Windows / wcp / Base / System / Windows / Markup / TypeConverterHelper.cs / 1 / TypeConverterHelper.cs

                            //------------------------------------------------------------------------ 
//
//  Microsoft Windows Client Platform
//  Copyright (C) Microsoft Corporation, 2006
// 
//  File: TypeConverterHelper.cs
// 
//  Description: Specifies that the whitespace surrounding an element should be trimmed. 
//
//--------------------------------------------------------------------------- 

using System;
using System.Reflection;
using System.ComponentModel; 
using System.Globalization;
using System.Diagnostics; 
 
#if PBTCOMPILER
namespace MS.Internal.Markup 
#else
namespace System.Windows.Markup
#endif
{ 

    ///  
    /// Class that provides fucntionality to obtain a TypeConverter from a property or the 
    /// type of the property, based on logic similar to TypeDescriptor.GetConverter.
    ///  
    internal static class TypeConverterHelper
    {
        internal static MemberInfo GetMemberInfoForPropertyConverter(object dpOrPiOrMi)
        { 
            MemberInfo memberInfo = dpOrPiOrMi as PropertyInfo;
 
            if (memberInfo == null) 
            {
                MethodInfo methodInfo; 
#if !PBTCOMPILER
                DependencyProperty dp = dpOrPiOrMi as DependencyProperty;

                if (dp != null) 
                {
                    // While parsing styles or templates, we end up getting a DependencyProperty, 
                    // even for non-attached cases. In this case, we try fetching the CLR 
                    // property info and getting its attributes.
                    memberInfo = dp.OwnerType.GetProperty( 
                                 dp.Name,
                                 BindingFlags.Instance | BindingFlags.Public |
                                 BindingFlags.NonPublic | BindingFlags.FlattenHierarchy);
 
                    // We failed to get a CLR wrapper for the DependencyProperty, so we
                    // assume that this is an attached property and look for the MethodInfo 
                    // for the static getter. 
                    if (memberInfo == null)
                    { 
                        // Get the method member that defines the DependencyProperty
                        memberInfo = dp.OwnerType.GetMethod(
                                     "Get" + dp.Name,
                                     BindingFlags.Public | BindingFlags.NonPublic | 
                                     BindingFlags.Static | BindingFlags.FlattenHierarchy);
                    } 
                } 
                else
#endif 
                if ((methodInfo = dpOrPiOrMi as MethodInfo) != null)
                {
                    // miSetter may not be a MethodInfo when we are dealing with event handlers that
                    // belong to local assemblies. One such case is encountered when building DrtCompiler. 
                    if (methodInfo.GetParameters().Length == 1)
                    { 
                        // Use Getter of the attached property 
                        memberInfo = methodInfo;
                    } 
                    else
                    {
                        // Use the Setter of the attached property (if any)
                        memberInfo = methodInfo.DeclaringType.GetMethod( 
                             "Get" + methodInfo.Name.Substring("Set".Length),
                             BindingFlags.Public | BindingFlags.NonPublic | 
                             BindingFlags.Static | BindingFlags.FlattenHierarchy); 
                    }
                } 
            }

            return memberInfo;
        } 

        internal static Type GetConverterType(MemberInfo memberInfo) 
        { 
            Debug.Assert(null != memberInfo, "Null passed for memberInfo to GetConverterType");
 
            Type converterType = null;

            // Try looking for the TypeConverter for the type using reflection.
            string converterName = ReflectionHelper.GetTypeConverterAttributeData(memberInfo, out converterType); 

            if (converterType == null) 
            { 
                converterType = GetConverterTypeFromName(converterName);
            } 

            return converterType;
        }
 
        internal static Type GetConverterType(Type type)
        { 
            Debug.Assert(null != type, "Null passed for type to GetConverterType"); 

            Type converterType = null; 

            // Try looking for the TypeConverter for the type using reflection.
            string converterName = ReflectionHelper.GetTypeConverterAttributeData(type, out converterType);
 
            if (converterType == null)
            { 
                converterType = GetConverterTypeFromName(converterName); 
            }
 
            return converterType;
        }

        private static Type GetConverterTypeFromName(string converterName) 
        {
            Type converterType = null; 
 
            if (!string.IsNullOrEmpty(converterName))
            { 
                converterType = ReflectionHelper.GetQualifiedType(converterName);

                if (converterType != null)
                { 
                    // Validate that this is an accessible type converter.
                    if (!ReflectionHelper.IsPublicType(converterType)) 
                    { 
#if PBTCOMPILER
                        if (!ReflectionHelper.IsInternalType(converterType) || 
                            !ReflectionHelper.IsInternalAllowedOnType(converterType))
                        {
#endif
                            converterType = null; 
#if PBTCOMPILER
                        } 
#endif 
                    }
                } 
            }

            return converterType;
        } 

        internal static Type GetCoreConverterTypeFromCustomType(Type type) 
        { 
            Type converterType = null;
            if (type.IsEnum) 
            {
                // Need to handle Enums types specially as they require a ctor that
                // takes the underlying type, but at compile time we only need to know
                // the Type of the Converter and not an actual instance of it. 
                converterType = typeof(EnumConverter);
            } 
            else if (typeof(Int32).IsAssignableFrom(type)) 
            {
                converterType = typeof(Int32Converter); 
            }
            else if (typeof(Int16).IsAssignableFrom(type))
            {
                converterType = typeof(Int16Converter); 
            }
            else if (typeof(Int64).IsAssignableFrom(type)) 
            { 
                converterType = typeof(Int64Converter);
            } 
            else if (typeof(UInt32).IsAssignableFrom(type))
            {
                converterType = typeof(UInt32Converter);
            } 
            else if (typeof(UInt16).IsAssignableFrom(type))
            { 
                converterType = typeof(UInt16Converter); 
            }
            else if (typeof(UInt64).IsAssignableFrom(type)) 
            {
                converterType = typeof(UInt64Converter);
            }
            else if (typeof(Boolean).IsAssignableFrom(type)) 
            {
                converterType = typeof(BooleanConverter); 
            } 
            else if (typeof(Double).IsAssignableFrom(type))
            { 
                converterType = typeof(DoubleConverter);
            }
            else if (typeof(Single).IsAssignableFrom(type))
            { 
                converterType = typeof(SingleConverter);
            } 
            else if (typeof(Byte).IsAssignableFrom(type)) 
            {
                converterType = typeof(ByteConverter); 
            }
            else if (typeof(SByte).IsAssignableFrom(type))
            {
                converterType = typeof(SByteConverter); 
            }
            else if (typeof(Char).IsAssignableFrom(type)) 
            { 
                converterType = typeof(CharConverter);
            } 
            else if (typeof(Decimal).IsAssignableFrom(type))
            {
                converterType = typeof(DecimalConverter);
            } 
            else if (typeof(TimeSpan).IsAssignableFrom(type))
            { 
                converterType = typeof(TimeSpanConverter); 
            }
            else if (typeof(Guid).IsAssignableFrom(type)) 
            {
                converterType = typeof(GuidConverter);
            }
            else if (typeof(String).IsAssignableFrom(type)) 
            {
                converterType = typeof(StringConverter); 
            } 
            else if (typeof(CultureInfo).IsAssignableFrom(type))
            { 
                converterType = typeof(CultureInfoConverter);
            }
            else if (typeof(Type).IsAssignableFrom(type))
            { 
                converterType = typeof(TypeTypeConverter);
            } 
            else if (typeof(DateTime).IsAssignableFrom(type)) 
            {
                converterType = typeof(DateTimeConverter2); 
            }

            return converterType;
        } 

#if !PBTCOMPILER 
        private static CultureInfo EnglishUSCulture 
        {
            get 
            {
                if (_englishUSCulture == null)
                {
                    _englishUSCulture = CultureInfo.GetCultureInfo("en-us"); 
                }
 
                return _englishUSCulture; 
            }
        } 

        private static CultureInfo _englishUSCulture = null;

        private static TypeConverter GetCoreConverterFromCoreType(Type type) 
        {
            TypeConverter typeConverter = null; 
            if (type == typeof(Int32)) 
            {
                typeConverter = new System.ComponentModel.Int32Converter(); 
            }
            else if (type == typeof(Int16))
            {
                typeConverter = new System.ComponentModel.Int16Converter(); 
            }
            else if (type == typeof(Int64)) 
            { 
                typeConverter = new System.ComponentModel.Int64Converter();
            } 
            else if (type == typeof(UInt32))
            {
                typeConverter = new System.ComponentModel.UInt32Converter();
            } 
            else if (type == typeof(UInt16))
            { 
                typeConverter = new System.ComponentModel.UInt16Converter(); 
            }
            else if (type == typeof(UInt64)) 
            {
                typeConverter = new System.ComponentModel.UInt64Converter();
            }
            else if (type == typeof(Boolean)) 
            {
                typeConverter = new System.ComponentModel.BooleanConverter(); 
            } 
            else if (type == typeof(Double))
            { 
                typeConverter = new System.ComponentModel.DoubleConverter();
            }
            else if (type == typeof(Single))
            { 
                typeConverter = new System.ComponentModel.SingleConverter();
            } 
            else if (type == typeof(Byte)) 
            {
                typeConverter = new System.ComponentModel.ByteConverter(); 
            }
            else if (type == typeof(SByte))
            {
                typeConverter = new System.ComponentModel.SByteConverter(); 
            }
            else if (type == typeof(Char)) 
            { 
                typeConverter = new System.ComponentModel.CharConverter();
            } 
            else if (type == typeof(Decimal))
            {
                typeConverter = new System.ComponentModel.DecimalConverter();
            } 
            else if (type == typeof(TimeSpan))
            { 
                typeConverter = new System.ComponentModel.TimeSpanConverter(); 
            }
            else if (type == typeof(Guid)) 
            {
                typeConverter = new System.ComponentModel.GuidConverter();
            }
            else if (type == typeof(String)) 
            {
                typeConverter = new System.ComponentModel.StringConverter(); 
            } 
            else if (type == typeof(CultureInfo))
            { 
                typeConverter = new System.ComponentModel.CultureInfoConverter();
            }
            else if (type == typeof(Type))
            { 
                typeConverter = new System.Windows.Markup.TypeTypeConverter();
            } 
            else if (type == typeof(DateTime)) 
            {
                typeConverter = new DateTimeConverter2(); 
            }
            else if (ReflectionHelper.IsNullableType(type))
            {
                typeConverter = new System.ComponentModel.NullableConverter(type); 
            }
 
            return typeConverter; 
        }
 
        internal static TypeConverter GetCoreConverterFromCustomType(Type type)
        {
            TypeConverter typeConverter = null;
            if (type.IsEnum) 
            {
                // Need to handle Enums types specially as they require a ctor that 
                // takes the underlying type. 
                typeConverter = new System.ComponentModel.EnumConverter(type);
            } 
            else if (typeof(Int32).IsAssignableFrom(type))
            {
                typeConverter = new System.ComponentModel.Int32Converter();
            } 
            else if (typeof(Int16).IsAssignableFrom(type))
            { 
                typeConverter = new System.ComponentModel.Int16Converter(); 
            }
            else if (typeof(Int64).IsAssignableFrom(type)) 
            {
                typeConverter = new System.ComponentModel.Int64Converter();
            }
            else if (typeof(UInt32).IsAssignableFrom(type)) 
            {
                typeConverter = new System.ComponentModel.UInt32Converter(); 
            } 
            else if (typeof(UInt16).IsAssignableFrom(type))
            { 
                typeConverter = new System.ComponentModel.UInt16Converter();
            }
            else if (typeof(UInt64).IsAssignableFrom(type))
            { 
                typeConverter = new System.ComponentModel.UInt64Converter();
            } 
            else if (typeof(Boolean).IsAssignableFrom(type)) 
            {
                typeConverter = new System.ComponentModel.BooleanConverter(); 
            }
            else if (typeof(Double).IsAssignableFrom(type))
            {
                typeConverter = new System.ComponentModel.DoubleConverter(); 
            }
            else if (typeof(Single).IsAssignableFrom(type)) 
            { 
                typeConverter = new System.ComponentModel.SingleConverter();
            } 
            else if (typeof(Byte).IsAssignableFrom(type))
            {
                typeConverter = new System.ComponentModel.ByteConverter();
            } 
            else if (typeof(SByte).IsAssignableFrom(type))
            { 
                typeConverter = new System.ComponentModel.SByteConverter(); 
            }
            else if (typeof(Char).IsAssignableFrom(type)) 
            {
                typeConverter = new System.ComponentModel.CharConverter();
            }
            else if (typeof(Decimal).IsAssignableFrom(type)) 
            {
                typeConverter = new System.ComponentModel.DecimalConverter(); 
            } 
            else if (typeof(TimeSpan).IsAssignableFrom(type))
            { 
                typeConverter = new System.ComponentModel.TimeSpanConverter();
            }
            else if (typeof(Guid).IsAssignableFrom(type))
            { 
                typeConverter = new System.ComponentModel.GuidConverter();
            } 
            else if (typeof(String).IsAssignableFrom(type)) 
            {
                typeConverter = new System.ComponentModel.StringConverter(); 
            }
            else if (typeof(CultureInfo).IsAssignableFrom(type))
            {
                typeConverter = new System.ComponentModel.CultureInfoConverter(); 
            }
            else if (typeof(Type).IsAssignableFrom(type)) 
            { 
                typeConverter = new System.Windows.Markup.TypeTypeConverter();
            } 
            else if (typeof(DateTime).IsAssignableFrom(type))
            {
                typeConverter = new DateTimeConverter2();
            } 

            return typeConverter; 
        } 

        ///  
        /// Returns a TypeConverter for the given target Type, otherwise null if not found.
        /// First, if the type is one of the known system types, it lookups a table to determine the TypeConverter.
        /// Next, it tries to find a TypeConverterAttribute on the type using reflection.
        /// Finally, it looks up the table of known typeConverters again if the given type derives from one of the 
        /// known system types.
        ///  
        /// The target Type for which to find a TypeConverter. 
        /// A TypeConverter for the Type type if found. Null otherwise.
        internal static TypeConverter GetTypeConverter(Type type) 
        {
            if (type == null)
            {
                throw new ArgumentNullException("type"); 
            }
 
            TypeConverter typeConverter = GetCoreConverterFromCoreType(type); 

            if (typeConverter == null) 
            {
                Type converterType = GetConverterType(type);
                if (converterType != null)
                { 
                    typeConverter = Activator.CreateInstance(converterType,
                                                             BindingFlags.Instance | BindingFlags.CreateInstance | BindingFlags.Public, 
                                                             null, 
                                                             null,
                                                             EnglishUSCulture) as TypeConverter; 
                }
                else
                {
                    typeConverter = GetCoreConverterFromCustomType(type); 
                }
 
                if (typeConverter == null) 
                {
                    typeConverter = new TypeConverter(); 
                }
            }

            return typeConverter; 
        }
#endif 
    } 
}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.


                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK