当前位置: 移动技术网 > IT编程>开发语言>c# > 关于C#基础知识回顾--反射(二)

关于C#基础知识回顾--反射(二)

2019年07月18日  | 移动技术网IT编程  | 我要评论
使用反射调用方法:一旦知道一个类型所支持的方法,就可以对方法进行调用。调用时,需使用包含在methodinfo中的invoke()方法。调用形式:object invoke

使用反射调用方法:
一旦知道一个类型所支持的方法,就可以对方法进行调用。调用时,需使用包含在
methodinfo中的invoke()方法。调用形式:
object invoke(object ob, object[] args)
 
这里ob是一个对象引用,将调用它所指向的对象上的方法。对于静态方法,ob必须为null。

所有需要传递给方法的参数都必须在args数组中指定。如果方法不需要参数,则args必须为null。

另外,数组args的元素数量参数必须等于参数的数量。invoke()方法返回被调用方法的返回值。

要调用某个方法,只需在一个methodinfo实例上调用invoke(),该实例通过调用
getmethods()

方法获得。请看事例:

复制代码 代码如下:

using system;
using system.collections.generic;
using system.linq;
using system.text;
using system.reflection;
namespace reflection
{
    class program
    {
        static void main(string[] args)
        {
           // demo1();
            invokemethdemo();
            console.readkey();
        }

        static void invokemethdemo()
        {
            //获得myclass的类型队形
            type t = typeof(myclass);
            myclass reflectob = new myclass(10, 20);
            console.writeline("类名:{0}", t.name);
            console.writeline("本类所提供的方法有:");
            methodinfo[] mi = t.getmethods();
            int val;
            foreach (methodinfo m in mi)
            {
                console.writeline();

                //显示参数
                parameterinfo[] pi = m.getparameters();
                if (m.name == "set" && pi[0].parametertype == typeof(int))
                {
                    console.write("set(int,int)  ");
                    object[] args = new object[2];
                    args[0] = 9;
                    args[1] = 18;
                    m.invoke(reflectob, args);
                }
                else if (m.name == "set" && pi[0].parametertype == typeof(double))
                {
                    console.write("set(double,double)  ");
                    object[] args = new object[2];
                    args[0] = 2.34;
                    args[1] = 13.56;
                    m.invoke(reflectob, args);
                }
                else if (m.name.compareto("sum") == 0) {
                    console.write("sum() ");
                    val = (int)m.invoke(reflectob, null);
                    console.writeline("sum is {0}",val);
                }
                else if(m.name.compareto("isbetween")==0)
                {
                    object[] args = new object[1];
                    args[0] = 17;
                    if ((bool)m.invoke(reflectob, args))
                    {
                        console.writeline("{0}在x和y之间",args[0]);
                    }
                }
                console.writeline();
            }
        }
    }
}
class myclass
{
    int x;
    int y;
    public myclass(int i, int j)
    {
        x = i;
        y = j;
    }
    public int sum()
    {
        return x + y;
    }
    public bool isbetween(int i)
    {
        if (x < i && i < y)
            return true;
        else
            return false;
    }
    public void set(int a, int b)
    {
        x = a;
        y = b;
        show();
    }
    public void set(double a, double b)
    {
        x = (int)a;
        y = (int)b;
        show();
    }
    public void show()
    {
        console.writeline("x:{0},y:{1}", x, y);
    }
}

运行结果如下:


如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网