| 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; } } }