using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
public static class TypeExtension
{
/// <summary>
/// 获取程序集内所有派生类型
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
public static List<Type> SearchAllDerive(this Type type, Predicate<Type> match = null)
{
var types = Assembly.GetCallingAssembly().GetTypes();
List<Type> ret = new List<Type>();
foreach (var t in types)
{
var it = t.GetInterfaces();
if(it.Exist(i => i.Name == type.Name && (match == null || match.Invoke(t))))
ret.Add(t);
}
return ret;
}
/// <summary>
/// 获取程序集内所有派生类
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
public static List<Type> SearchAllDeriveClass(this Type type)
{
return type.SearchAllDerive(t => t.IsClass);
}
/// <summary>
/// 从程序域中指定程序集获取类型
/// </summary>
/// <param name="assemblyNames"></param>
/// <param name="match"></param>
/// <returns></returns>
public static List<Type> GetTypesFromDomain(IList<string> assemblyNames, Predicate<Type> match = null)
{
Assembly[] ass = AppDomain.CurrentDomain.GetAssemblies();
var alist = ass.FindAll(a => assemblyNames.Exist(s => s == a.GetName().Name));
var types = new List<Type>(100);
alist.ForEach(a => types.AddRange(a.GetTypes().FindAll(match)));
return types;
}
public static bool TryGetAttribute<T>(this object o, out T attr) where T : Attribute
{
var field = o.GetType().GetField(o.ToString());
attr = System.Attribute.GetCustomAttribute(field!, typeof(T)) as T;
return attr != null;
}
}
12-02
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交