C#基础知识回顾-- 反射(2)

简介: 使用反射调用方法: 一旦知道一个类型所支持的方法,就可以对方法进行调用。调用时,需使用包含在   MethodInfo中的Invoke()方法。调用形式:   object Invoke(object ob, object[] args)   这里ob是一个对象引用,将调用它所指向的对象上的方法。
使用反射调用方法:
一旦知道一个类型所支持的方法,就可以对方法进行调用。调用时,需使用包含在
 
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( 1020);

            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);
    }
}
运行结果如下:

 

 

目录
相关文章
|
5月前
|
机器学习/深度学习 开发框架 .NET
技术经验解读:【c#】反射真的很可怕吗?
技术经验解读:【c#】反射真的很可怕吗?
|
6月前
|
API C# 数据库
C#反射详解
C#反射详解
55 0
|
6月前
|
设计模式 C#
C#反射机制实现开闭原则的简单工厂模式
C#反射机制实现开闭原则的简单工厂模式
52 0
|
6月前
|
存储 C# 开发者
C# | 通过反射将对象属性展示在TreeView中
在编程过程中,我们经常需要处理复杂的对象和数据结构。将这些数据结构展示在UI界面上是很有用的,可以帮助开发者更好地理解和分析数据。 而TreeView作为一种常见的控件,可以以树状结构的方式展示数据,非常适合用于展示层次化的对象。 本文将介绍如何使用TreeView控件展示一个对象,并且可以动态处理对象中的属性和子对象。通过本文的学习,您将学会如何更好地理解和展示数据,提高编程效率。
71 0
C# | 通过反射将对象属性展示在TreeView中
|
存储 Java API
C#反射(Reflection)详解
反射是.NET中的重要机制,通过反射可以得到*.exe或*.dll等程序集内部的接口、类、方法、字段、属性、特性等信息,还可以动态创建出类型实例并执行其中的方法。反射指程序可以访问、检测和修改它本身状态或行为的一种能力。通俗一点:我们在获取其他实体类的字段名或实列,只能获取公有的,而有了反射之后可以获取私有的,可以获取他的基类等等,可以说把家底查得清清楚楚。
218 1
|
11月前
|
安全 C# 图形学
C#的反射机制
C#的反射机制
|
开发框架 缓存 安全
C#OOP之十三 组件、程序集与反射
C#OOP之十三 组件、程序集与反射
66 0
|
开发框架 .NET Java
C#下反射动态加载dll后如何卸载?
C#下反射动态加载dll后如何卸载?
|
Oracle 架构师 关系型数据库
C#反射应用之实现动态可配置可扩展框架的简单示例
C#反射应用之实现动态可配置可扩展框架的简单示例
|
Java 关系型数据库 MySQL
C#反射(Reflection)详解及于java反射的对比
C#反射(Reflection)详解及于java反射的对比