C#反射调用程序集类中方法

建立类

class OperatorClass
    {
        /// <summary>
        /// 加法
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        ///
        public static int Add(int x, int y)
        {
            return x + y;
        }
        /// <summary>
        /// 减法
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        public static int Subtract(int x, int y)
        { return x - y; }
        /// <summary>         /// 乘法
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        public int Mulitiple(int x, int y)
        { return x * y; }
        /// <summary>
        /// 除法
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        public int Divide(int x, int y)
        {
            if (y == 0)
            {
                Console.WriteLine("除法操作时,除数不能为,返回值暂设定为.");
                return 0;
            } return x / y;
        }
        /// <summary>
        /// 取余数求余
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        public int Remain(int x, int y)
        {
            if (y == 0)
            {
                Console.WriteLine("取余操作时,除数不能为,返回值暂设定为.");
                return 0;
            }
            return x % y;
        }
        /// <summary>
        /// 获取数组的最大数以及最大数所在的索引
        /// </summary>
        /// <param name="array">数组</param>
        /// <param name="maxIndex">输出最大值的所在的索引</param>
        /// <returns></returns>
        public int GetMaxNumber(int[] array, out int maxIndex)
        {
            if (array == null || array.Length == 0)
            {
                Console.WriteLine("数组不能为null,数组的长度也不能为,暂定返回值为-1");
                maxIndex = -1; return -1;
            }
            int max = array[0]; maxIndex = 0;
            for (int i = 1; i < array.Length; i++)
            {
                if (max < array[i])
                {
                    maxIndex = i;
                    max = array[i];
                }
            } return max;
        }
        /// <summary>
        /// 获得不定项数组的长度
        /// </summary>
        /// <param name="array"></param>
        /// <returns></returns>
        public int GetVaryArrayLength(params int[] array)
        {
            if (array == null)
            {
                return 0;
            }
            return array.Length;
        }
        /// <summary>
        /// 测试带ref的参数
        /// </summary>
        /// <param name="inParameter"></param>
        /// <param name="refParameter"></param>
        public void TestReference(int inParameter, ref int refParameter)
        {
            inParameter = 5;
            refParameter = 2;
            Console.WriteLine("参数默认为输入参数,如:inParameter,不会改变原来的值.\r\n带ref或者out的参数是引用参数,如:refParameter,可以改变原来的值.");
        }

        public bool TestString(string s1, string s2)
        {
            string ss = s1 + s2;
            return true;
        }
        /// <summary>
        /// 私有方法无法通过反射得到该方法的信息
        /// </summary>
        private void PrivateMethod()
        {
            Console.WriteLine("私有方法");
        }
    }

加载程序集的类,获得其中的方法

Assembly assembly = Assembly.Load("TestClassLibrary");
            Console.WriteLine("程序集信息:\n" + assembly.FullName);
            Console.WriteLine();
            Type[] ts = assembly.GetTypes();//获得程序集中定义的类型             
            for (int i = 0; i < ts.Length; i++)
            {
                string typeFullName = ts[i].FullName;
                Console.WriteLine("类型{0}:[{1}]的所有公共方法:", i + 1, typeFullName);
                MethodInfo[] mis = ts[i].GetMethods();//返回当前类型的所有公共方法 
                for (int j = 0; j < mis.Length; j++)
                {
                    Console.WriteLine("方法名{0}:{1},返回值的类型:{2},是静态方法:{3}",
                        j + 1, mis[j].Name, mis[j].ReturnType, mis[j].IsStatic); ParameterInfo[] paras = mis[j].GetParameters();//获取指定的方法或构造函数的参数信息 
                    for (int k = 0; k < paras.Length; k++)
                    {
                        //当我们知道方法的类型是引用类型时(带有"&"表示引用类型) 如:System.Int32&,此时参数带ref或out修饰 
                        //如果参数是输出参数(paras[k].IsOut==true),则参数的修饰是out,否则是ref 
                        Console.WriteLine("    参数{0}:{1} {2},签名位置:{3},是输出参数:{4}",
                            k + 1, paras[k].ParameterType, paras[k].Name, paras[k].Position, paras[k].IsOut);
                    }
                }
                Console.WriteLine();
            }

方法的调用

/// <summary> 
        /// 测试调用类库中的方法         
        /// </summary> 
        static void TestInvokeMethod()
        {
            Type ty = System.Reflection.Assembly.Load("TestClassLibrary").GetType(string.Format("{0}.{1}", "TestClassLibrary", "OperatorClass"));
            Console.WriteLine("调用TestClassLibrary.OperatorClass 类的公共静态方法public static int Add(int x, int y) 的例子");
            System.Reflection.MethodInfo mi = ty.GetMethod("Add");
            //调用静态方法Add时,Invoke的第一个参数为null 
            object returnValue = mi.Invoke(null, new object[] { 2, 3 });
            Console.WriteLine("Add方法的返回值:{0}\r\n", returnValue);
            Console.WriteLine("调用TestClassLibrary.OperatorClass 类的公共方法public int GetMaxNumber(int[] array, out int maxIndex) 的例子");
            System.Reflection.MethodInfo mi1 = ty.GetMethod("GetMaxNumber");
            //调用实例化方法(非静态方法)需要创建类型的一个实例             
            object instanceObject = Activator.CreateInstance(ty);
            int maxIndex = -1;
            object[] parametersInfo = new object[] { new int[] { 8, 20, 15, 36, 1, 2 }, maxIndex };
            //调用实例化方法GetMaxNumber时,Invoke的第一个参数是一个实例化对象             
            object returnValue1 = mi1.Invoke(instanceObject, parametersInfo);
            maxIndex = Convert.ToInt32(parametersInfo[1]);
            Console.WriteLine("GetMaxNumber方法的返回值(最大值):{0},最大值的索引:{1}", returnValue1, maxIndex);

            System.Reflection.MethodInfo mi2 = ty.GetMethod("TestString");
            object[] str = new object[] { "abc", "123" };
            object returnvalue2 = mi2.Invoke(instanceObject, str);
        }

练习代码

C#反射调用程序集类中方法,布布扣,bubuko.com

时间: 2024-10-26 11:12:25

C#反射调用程序集类中方法的相关文章

C#实现调用Java类中方法

基本思路: 用C#实现调用Java编写的类中的方法:重点是将Java编写的程序打包成Jar,然后使用开源工具IKVM将其转化成DLL控件,在.NET环境下调用. 分为以下步骤: 1.下载JDK6(注:JDK7下可能不支持,建议使用JDK6和Eclipse),进行安装,然后配置环境变量Path,将JDK安装的路径(例如:D:\Program Files\Java\jdk1.6.0_10\bin)添加到Path变量后面,如图所示: 用cmd打开DOS框,输入javac就可以查看是否配置成功,配置成功

Java反射机制demo(五)—获得并调用一个类中的方法

这个demo在使用反射机制操作属性之前,主要原因是因为在.class文件字节码中,方法排在属性的前面. 1,获得一个类中的方法 先看一下方法和运行结果.获取所有的方法使用Class类中getMethos()方法. 待获取的类: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 package

jsp中怎么调用java类中的方法

在jsp页面中先要,引入java类 例如: <%@page import="javabean.DbConn"%><!-- 引入包中的"类" --> <!--在用到的地方,直接对类实例化--> <% DbConn  DB=new  DbConn(); %> <!--然后就可以直接调用类中的方法--> <% Connection con=DB.conn(); %> jsp中怎么调用java类中的方法

struts_2_Action类中方法的动态调用

(一)直接调用方法(不推荐使用) 1)Action类: private String savePath; public String getSavePath() { return savePath; } public void setSavePath(String savePath) { this.savePath = savePath; } public String other() { savePath = "other"; return "success";

Java 反射调用私有域和方法(setAccessible)

Java 反射调用私有域和方法(setAccessible) @author ixenos AccessibleObject类 Method.Field和Constructor类共同继承了AccessibleObject类,该基类有两个setAccessible方法能在运行时压制Java语言访问控制检查(Java language access control checks),从而能任意调用被私有化保护的方法.域和构造方法 public class AccessibleObjectextends

Java反射调用多种类型的方法总结

最近一直在搞Java中的反射,遇到了小问题,所以总结下反射时调用方法需要注意的事项以及各种例子. 本例主要实现的功能有 * 1.没有参数的方法 * 2.一个参数的方法,没有返回值的方法 * 3.多个参数的方法 * 4.参数为数组的方法 * 5.参数为集合的方法 * 6.返回值为数组的方法 下面直接来例子 package com.mine.practice.reflectMethod; import java.lang.reflect.InvocationTargetException; impo

java 虚方法。 后面new 那个类, 就调用哪个类的方法 ,而非定义类的方案。 关于父子 类的 呵呵

java   虚方法.     后面new  那个类, 就调用哪个类的方法 ,而非定义类的方案.  关于父子 类的   呵呵 在多态的情况下,声明为父类类型的引用变量只能调用父类中的方法,但如果此变量实际引用的是子类对象,而子类对象中覆盖了父类的方法,这时父类对象调用的是子类中的方法,这种机制就成为虚方法调用.所以,同样的两个引用变量调用相同的方法结果可能不同.

WebView之js调用Android类的方法传递数据

1,具体的思路如下: 在android中写一个Activity,里面写一个webview,这个webview加载本地的一个html文件,显示这个网页,这个网页包括一个用户名和密码的输入框和两个按钮(只有登陆按钮有用),输入用户名密码之后调用android中的类,并把输入的数据传过去,再在android中输出出来(具体你那数据做什么操作就看你的需求了),这样就做大额js与android数据交互的效果了: 在android端,一些webviwe的设置和自定义类的写法如下源码: package com

C#1(.net和C#的关系、VS与.net的对应关系、VS2012常用的几种应用程序、C#定义一个类的方法、类页面内容的解释、定义Person的类、调用Person类的方法、命名规范、数值类型)

1..net和C#的关系 .net是一个开发平台,C#是应用在.net平台上的一种语言.   2.VS与.net的对应关系  3.VS2012常用的几种应用程序 第一种是Windows窗体应用程序,也即是我们常用的C/S端的应用软件: 第二种是控制台应用程序,主要是用来学习调试C#代码的(老师上课应用的模式): 第三种是空Web应用程序,建立空的网页模式,B/S模式: 第四种是Web 窗体应用程序,建立后会生成一些常用的网页组件和功能,例如JS.image等,也是B/S模式. 4.C#定义一个类