2022-01-26 14:17:37 +08:00
|
|
|
|
using System;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
|
|
|
|
|
namespace SKIT.FlurlHttpClient.Wechat.TenpayV2.Utilities
|
|
|
|
|
{
|
|
|
|
|
internal static class ReflectionUtility
|
|
|
|
|
{
|
|
|
|
|
public static void CreateOrExpandArray(ref Array? array, Type elementType, int capacity)
|
|
|
|
|
{
|
|
|
|
|
if (elementType == null) throw new ArgumentNullException(nameof(elementType));
|
|
|
|
|
if (capacity <= 0) throw new ArgumentOutOfRangeException(nameof(capacity));
|
|
|
|
|
|
|
|
|
|
if (array == null)
|
|
|
|
|
{
|
|
|
|
|
array = Array.CreateInstance(elementType, capacity);
|
|
|
|
|
}
|
|
|
|
|
else if (array.Length < capacity)
|
|
|
|
|
{
|
|
|
|
|
Array tmpArray = Array.CreateInstance(elementType, capacity);
|
|
|
|
|
Array.Copy(array, tmpArray, array.Length);
|
|
|
|
|
array = tmpArray;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static void CreateOrExpandArrayElement(Array array, int index, Func<object, object>? updateFactory)
|
|
|
|
|
{
|
|
|
|
|
if (array == null) throw new ArgumentNullException(nameof(array));
|
|
|
|
|
if (index < 0 || index >= array.Length) throw new ArgumentOutOfRangeException(nameof(index));
|
|
|
|
|
if (updateFactory == null) throw new ArgumentNullException(nameof(updateFactory));
|
|
|
|
|
|
|
|
|
|
object? element = array.GetValue(index);
|
|
|
|
|
if (element is null)
|
|
|
|
|
{
|
|
|
|
|
Type elementType = array.GetType().GetElementType()!;
|
|
|
|
|
|
|
|
|
|
if (elementType.IsAbstract || elementType.IsInterface)
|
|
|
|
|
{
|
|
|
|
|
throw new NotSupportedException();
|
|
|
|
|
}
|
|
|
|
|
else if (elementType.IsArray)
|
|
|
|
|
{
|
|
|
|
|
element = Array.CreateInstance(elementType, 0);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
element = Activator.CreateInstance(elementType);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-03-11 20:07:12 +08:00
|
|
|
|
element = updateFactory(element!);
|
2022-01-26 14:17:37 +08:00
|
|
|
|
array.SetValue(element, index);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static bool CheckTypeIsSubclassOf(Type childType, Type baseType)
|
|
|
|
|
{
|
|
|
|
|
bool IsTheRawGenericType(Type type)
|
|
|
|
|
=> baseType == (type.IsGenericType ? type.GetGenericTypeDefinition() : type);
|
|
|
|
|
|
|
|
|
|
bool isTheRawGenericType = childType.GetInterfaces().Any(IsTheRawGenericType);
|
|
|
|
|
if (isTheRawGenericType)
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
Type? t = childType;
|
|
|
|
|
while (t != null && t != typeof(object))
|
|
|
|
|
{
|
|
|
|
|
isTheRawGenericType = IsTheRawGenericType(t);
|
|
|
|
|
if (isTheRawGenericType) return true;
|
|
|
|
|
t = t.BaseType;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|