| File: Binding\TypeExtensions.cs | Web Access |
| Project: src\command-line-api\src\System.CommandLine\System.CommandLine.csproj (System.CommandLine) |
// Copyright (c) .NET Foundation and contributors. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. using System.Collections; using System.Diagnostics.CodeAnalysis; namespace System.CommandLine.Binding { internal static class TypeExtensions { internal static Type? GetElementTypeIfEnumerable(this Type type) { if (type.IsArray) { return type.GetElementType(); } if (type == typeof(string)) { return null; } Type? enumerableInterface = null; if (type.IsEnumerable()) { enumerableInterface = type; } return enumerableInterface?.GenericTypeArguments switch { { Length: 1 } genericTypeArguments => genericTypeArguments[0], _ => null }; } internal static bool IsEnumerable(this Type type) { if (type == typeof(string)) { return false; } return type.IsArray || typeof(IEnumerable).IsAssignableFrom(type); } internal static bool IsNullable(this Type t) => Nullable.GetUnderlyingType(t) is not null; internal static bool TryGetNullableType( this Type type, [NotNullWhen(true)] out Type? nullableType) { nullableType = Nullable.GetUnderlyingType(type); return nullableType is not null; } } }