懒得勤快 2 years ago
parent
commit
78f168979c
1 changed files with 30 additions and 1 deletions
  1. 30 1
      Masuit.Tools.Abstractions/Reflection/ReflectionUtil.cs

+ 30 - 1
Masuit.Tools.Abstractions/Reflection/ReflectionUtil.cs

@@ -9,7 +9,6 @@ using System.Linq.Expressions;
 using System.Reflection;
 using System.Resources;
 using System.Text;
-using Masuit.Tools.Systems;
 
 namespace Masuit.Tools.Reflection
 {
@@ -285,6 +284,36 @@ namespace Masuit.Tools.Reflection
             return Encoding.GetEncoding(charset).GetString(bytes);
         }
 
+        /// <summary>
+        /// 判断指定的类型 <paramref name="type"/> 是否是指定泛型类型的子类型,或实现了指定泛型接口。
+        /// </summary>
+        /// <param name="type">需要测试的类型。</param>
+        /// <param name="generic">泛型接口类型,传入 typeof(IXxx&lt;&gt;)</param>
+        /// <returns>如果是泛型接口的子类型,则返回 true,否则返回 false。</returns>
+        public static bool HasImplementedRawGeneric([NotNull] this Type type, [NotNull] Type generic)
+        {
+            if (type == null) throw new ArgumentNullException(nameof(type));
+            if (generic == null) throw new ArgumentNullException(nameof(generic));
+
+            // 测试接口。
+            var isTheRawGenericType = type.GetInterfaces().Any(IsTheRawGenericType);
+            if (isTheRawGenericType) return true;
+
+            // 测试类型。
+            while (type != null && type != typeof(object))
+            {
+                isTheRawGenericType = IsTheRawGenericType(type);
+                if (isTheRawGenericType) return true;
+                type = type.BaseType;
+            }
+
+            // 没有找到任何匹配的接口或类型。
+            return false;
+
+            // 测试某个类型是否是指定的原始接口。
+            bool IsTheRawGenericType(Type test) => generic == (test.IsGenericType ? test.GetGenericTypeDefinition() : test);
+        }
+
         #endregion 资源获取
 
         #region 创建实例