[转]C# 关于反射类[System.Reflection] 根据类名 动态调用 类方法

本文转自:http://www.cnblogs.com/xianzuoqiaoqi/archive/2009/04/07/1431153.html

  /// <summary>
    /// Execute the function of the class
    /// </summary>
    /// <param name="ProjectName">the project name of the class </param>
    /// <param name="spaceName">the naming space name of the class</param>
    /// <param name="className">the name of the class</param>
    /// <param name="functionName">the function name which need to execute</param>
    /// <param name="parametersType">the type of the parameters</param>
    /// <param name="parametersValue">the value of the parameters</param>

    /// <param name="page">if you want to execute the function of the page ,set this parameter E.g. : this.Page</param>
    /// <returns>object</returns>
    public static object OperateFuction(string ProjectName, string spaceName, string className, string functionName, ArrayList parametersTypeStr, object[] parametersValue, out string Error,Page page)
    {
        //define the object which return
        object returnObj;
        //Init
        returnObj = null;
        Error = string.Empty;
        System.Reflection.Assembly asm;
        System.Type type;
        //the function in this page which not need the space name and project name
        if (!"".Equals(className))
        {
            type = Type.GetType(className);
        }else{
            type = page.GetType();
        }

        if (type == null)
        {
            string loadFile = string.Empty;
            loadFile = !"".Equals(ProjectName) ? ProjectName + ".dll" : "__code";
            if (!"__code".Equals(loadFile))
            {
                //get the class which in the other project
                string BasePath = System.AppDomain.CurrentDomain.BaseDirectory;
                BasePath = BasePath.Replace(@"\\", @"\");
                string ProjectDllPath =BasePath+ @"Bin\" + ProjectName + ".dll";
                try
                {
                    asm = System.Reflection.Assembly.LoadFrom(ProjectDllPath);
                }
                catch (System.Exception e)
                {
                 ProjectDllPath = BasePath +  ProjectName + ".dll";
                    asm = System.Reflection.Assembly.LoadFrom(ProjectDllPath);
                }
            }
            else
            {
                //get the class which in the App_Code file
                asm = System.Reflection.Assembly.Load(loadFile);
            }
            className = !"".Equals(spaceName) ? spaceName + "." + className : className;
            //get the  class which needs
            type = asm.GetType(className);
        }
        if (type != null)
        {
            //get the object of the class
            Object obj = Activator.CreateInstance(type);
            // define the parameters of the function
            System.Type[] parametersType = new Type[parametersTypeStr.Count];
            int i = 0;
            foreach (string str in parametersTypeStr)
            {
                parametersType[i] = System.Type.GetType(str);
                i++;
            }
            //get the function of the class
            System.Reflection.MethodInfo method = type.GetMethod(functionName, parametersType);
            if (method != null)
            {
                try
                {
                    // Execute the function of the class
                    returnObj = method.Invoke(obj, parametersValue);
                }
                catch (System.Exception e)
                {
                    Error = e.Message;
                }
            }
        }
        return returnObj;
    }

 

 

posted on 2010-01-20 23:57  freeliver54  阅读(2359)  评论(1编辑  收藏  举报

导航