You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
2.1 KiB
64 lines
2.1 KiB
#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member |
|
|
|
using System; |
|
#if UNITY_2018_3_OR_NEWER |
|
using UnityEngine; |
|
#endif |
|
|
|
namespace Cysharp.Threading.Tasks.Internal |
|
{ |
|
internal static class RuntimeHelpersAbstraction |
|
{ |
|
// If we can use RuntimeHelpers.IsReferenceOrContainsReferences(.NET Core 2.0), use it. |
|
public static bool IsWellKnownNoReferenceContainsType<T>() |
|
{ |
|
return WellKnownNoReferenceContainsType<T>.IsWellKnownType; |
|
} |
|
|
|
static bool WellKnownNoReferenceContainsTypeInitialize(Type t) |
|
{ |
|
// The primitive types are Boolean, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, IntPtr, UIntPtr, Char, Double, and Single. |
|
if (t.IsPrimitive) return true; |
|
|
|
if (t.IsEnum) return true; |
|
if (t == typeof(DateTime)) return true; |
|
if (t == typeof(DateTimeOffset)) return true; |
|
if (t == typeof(Guid)) return true; |
|
if (t == typeof(decimal)) return true; |
|
|
|
// unwrap nullable |
|
if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>)) |
|
{ |
|
return WellKnownNoReferenceContainsTypeInitialize(t.GetGenericArguments()[0]); |
|
} |
|
|
|
#if UNITY_2018_3_OR_NEWER |
|
|
|
// or add other wellknown types(Vector, etc...) here |
|
if (t == typeof(Vector2)) return true; |
|
if (t == typeof(Vector3)) return true; |
|
if (t == typeof(Vector4)) return true; |
|
if (t == typeof(Color)) return true; |
|
if (t == typeof(Rect)) return true; |
|
if (t == typeof(Bounds)) return true; |
|
if (t == typeof(Quaternion)) return true; |
|
if (t == typeof(Vector2Int)) return true; |
|
if (t == typeof(Vector3Int)) return true; |
|
|
|
#endif |
|
|
|
return false; |
|
} |
|
|
|
static class WellKnownNoReferenceContainsType<T> |
|
{ |
|
public static readonly bool IsWellKnownType; |
|
|
|
static WellKnownNoReferenceContainsType() |
|
{ |
|
IsWellKnownType = WellKnownNoReferenceContainsTypeInitialize(typeof(T)); |
|
} |
|
} |
|
} |
|
} |
|
|
|
|