using System; #if !UNITY_EDITOR && UNITY_WSA // For System.Reflection.TypeExtensions using System.Reflection; #endif namespace FullSerializer.Internal { public static class fsReflectionUtility { /// /// Searches for a particular implementation of the given interface type /// inside of the type. This is particularly useful if the interface type /// is an open type, ie, typeof(IFace{}), because this method will then /// return IFace{} but with appropriate type parameters inserted. /// /// The base type to search for interface /// /// The interface type to search for. Can be an open generic type. /// /// /// The actual interface type that the type contains, or null if there is /// no implementation of the given interfaceType on type. /// public static Type GetInterface(Type type, Type interfaceType) { if (interfaceType.Resolve().IsGenericType && interfaceType.Resolve().IsGenericTypeDefinition == false) { throw new ArgumentException("GetInterface requires that if the interface " + "type is generic, then it must be the generic type definition, not a " + "specific generic type instantiation"); }; while (type != null) { foreach (var iface in type.GetInterfaces()) { if (iface.Resolve().IsGenericType) { if (interfaceType == iface.GetGenericTypeDefinition()) { return iface; } } else if (interfaceType == iface) { return iface; } } type = type.Resolve().BaseType; } return null; } } }