using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
public static class TypeExtension
{
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;
}
public static List<Type> SearchAllDeriveClass(this Type type)
{
return type.SearchAllDerive(t => t.IsClass);
}
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;
}
}