File: System\Reflection\Context\CollectionServices.cs
Web Access
Project: src\runtime\src\libraries\System.Reflection.Context\src\System.Reflection.Context.csproj (System.Reflection.Context)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Collections.Generic;

namespace System.Reflection.Context
{
    internal static class CollectionServices
    {
        public static T[] Empty<T>()
        {
            return Array.Empty<T>();
        }

        public static bool CompareArrays<T>(T[] left, T[] right) where T : notnull
        {
            if (left.Length != right.Length)
                return false;

            for (int i = 0; i < left.Length; i++)
            {
                if (!left[i].Equals(right[i]))
                    return false;
            }

            return true;
        }

        public static int GetArrayHashCode<T>(T[] array) where T : notnull
        {
            int hashcode = 0;
            foreach (T t in array)
                hashcode ^= t.GetHashCode();

            return hashcode;
        }

        public static object[] ConvertListToArray(List<object> list, Type arrayType)
        {
            // Mimic the behavior of GetCustomAttributes in runtime reflection.
            if (arrayType.HasElementType || arrayType.IsValueType || arrayType.ContainsGenericParameters)
                return list.ToArray();

            // Converts results to typed array.
            Array typedArray = Array.CreateInstance(arrayType, list.Count);

            list.CopyTo((object[])typedArray);

            return (object[])typedArray;
        }

        public static object[] IEnumerableToArray(IEnumerable<object> enumerable, Type arrayType)
        {
            List<object> list = new List<object>(enumerable);

            return ConvertListToArray(list, arrayType);
        }
    }
}