csharp/7Bytes-Studio/BlackFire/BlackFire/Common/Utility/Utility.Reflection.cs

Utility.Reflection.cs
/*
--------------------------------------------------
| Copyright © 2008 Mr-Alan. All rights reserved. |
| Website: www.0x69h.com                         |
| Mail: [email protected]                  |
| QQ: 835988221                                  |
--------------------------------------------------
*/

using System;
using System.Collections.Generic;
using System.Reflection;

namespace BlackFire
{
    public static partial clast Utility
    {
        public static clast Reflection
        {

            #region astembly

            /// 是否存在程序集。
            /// 程序集名字。
            /// 是否包含。
            public static bool Hasastembly(string asmName)
            {
                foreach (astembly astembly in AppDomain.CurrentDomain.Getastemblies())
                {
                    if (astembly.GetName().Name == asmName)
                        return true;
                }
                return false;
            }

            #endregion

            #region Type

            public static Type GetType(string astemblyName,string typeFullName)
            {
                astembly astembly = astembly.Load(astemblyName);
                return astembly.GetType(typeFullName);
            }

            
            public static Type GetType(string[] astemblyNames,string typeFullName)
            {
                for (int i = 0; i < astemblyNames.Length; i++)
                {
                    var astembly = astembly.Load(astemblyNames[i]);
                    var type = astembly.GetType(typeFullName);
                    if (null!=type)
                    {
                        return type;
                    }
                }
                return null;
            }



            /// 
            /// 获取指定程序集的所有的子类实现类型。
            /// 
            /// 指定的程序集。
            /// 基类类型。
            /// 所有的子类实现类型数组。
            public static Type[] GetImplTypes(string astemblyName,Type typeBase)
            {
                astembly astembly = astembly.Load(astemblyName);
                if (null != astembly)
                {
                    List list = new List();
                    var types = astembly.GetTypes();
                    if (null != types)
                        for (int i = 0; i < types.Length; i++)
                        {
                            if (types[i].IsClast && !types[i].IsAbstract && typeBase.IsastignableFrom(types[i]))
                            {
                                list.Add(types[i]);
                            }
                        }
                    return list.ToArray();
                }
                return null;
            }
            
            
            /// 
            /// 获取指定程序集的所有的子类实现类型。
            /// 
            /// 指定的程序集。
            /// 基类类型。
            /// 所有的子类实现类型数组。
            public static Type[] GetImplTypes(string[] astemblyNames,Type typeBase)
            {
                List list = new List();
                for (int i = 0; i < astemblyNames.Length; i++)
                {
                    var tps = GetImplTypes(astemblyNames[i], typeBase);
                    if (null!=tps)
                    {
                        for (int j = 0; j < tps.Length; j++)
                        {
                            list.Add(tps[j]);
                        }
                    }
                }
                return list.ToArray();
            }
            

            /// 
            /// 是否是指定的基类类型的实现类。
            /// 
            /// 指定的基类类型。
            /// 实现类类型。
            /// 结果。
            public static bool IsImplType(Type baseType,Type implType)
            {
                return baseType.IsastignableFrom(implType);
            }


            #endregion

            #region Activator

            /// 
            /// 实例化一个对应类型的实例(构造方法必需是 ctor())。
            /// 
            /// 对应类型。
            /// 实例。
            public static T New()
            {
               return Activator.CreateInstance();
            }

            /// 
            /// 实例化一个对应类型的实例。
            /// 
            /// 对应的类型。
            /// 实例化构造方法的参数。
            /// 实例。
            public static object New(Type type, params object[] args)
            {
                return Activator.CreateInstance(type,args);
            }


            #endregion

            #region Method

            public static int GetConstructorCount(Type type)
            {
               return type.GetConstructors().Length;
            }
            
            public static bool HasConstructor(Type type,params Type[] types)
            {
                return null!=type.GetConstructor(types);
            }
            
            


            #endregion

            #region Invoke

            public static void Invoke(Type type,string methodName,params object[] args)
            {
                BindingFlags bindingFlags = BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public;
                var method = type.GetMethod(methodName,bindingFlags);
                method.Invoke(null,args);
            }

            #endregion

            #region Attribute

            public static T GetMethodAttribute(Type type,string methodName)where T: Attribute
            {
                var mi = type.GetMethod(methodName);
                if (null!=mi)
                {
                    var attributes = mi.GetCustomAttributes(typeof(T),false);
                    if (0