File: FrameworkFork\Microsoft.Xml\Xml\Serialization\TypeExtensions.cs
Web Access
Project: src\src\dotnet-svcutil\lib\src\dotnet-svcutil-lib.csproj (dotnet-svcutil-lib)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
namespace Microsoft.Xml.Serialization
{
    using System;
    using Microsoft.Xml;
    using System.Reflection;
 
    internal static class TypeExtensions
    {
        private const string ImplicitCastOperatorName = "op_Implicit";
 
        public static bool TryConvertTo(this Type targetType, object data, out object returnValue)
        {
            if (targetType == null)
            {
                throw new ArgumentNullException("targetType");
            }
 
            returnValue = null;
 
            if (data == null)
            {
                return !targetType.GetTypeInfo().IsValueType;
            }
 
            Type sourceType = data.GetType();
 
            if (targetType == sourceType ||
                targetType.IsAssignableFrom(sourceType))
            {
                returnValue = data;
                return true;
            }
 
            MethodInfo[] methods = targetType.GetMethods(BindingFlags.Static | BindingFlags.Public);
 
            foreach (MethodInfo method in methods)
            {
                if (method.Name == ImplicitCastOperatorName &&
                    method.ReturnType != null &&
                    targetType.IsAssignableFrom(method.ReturnType))
                {
                    ParameterInfo[] parameters = method.GetParameters();
 
                    if (parameters != null &&
                        parameters.Length == 1 &&
                        parameters[0].ParameterType.IsAssignableFrom(sourceType))
                    {
                        returnValue = method.Invoke(null, new object[] { data });
                        return true;
                    }
                }
            }
 
            return false;
        }
    }
}