程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> c#反射挪用辦法示例

c#反射挪用辦法示例

編輯:C#入門知識

c#反射挪用辦法示例。本站提示廣大學習愛好者:(c#反射挪用辦法示例)文章只能為提供參考,不一定能成為您想要的結果。以下是c#反射挪用辦法示例正文


獲得辦法的相干信息的兩種情勢

反射是一種許可用戶取得類信息的C#功效,Type對象映照它代表的底層對象;

在.Net 中, 一旦取得了Type對象,便可以應用GetMethods()辦法獲得此類型支撐的辦法列表;該辦法的兩種情勢:

MethodInfo [] GetMethods()

MethodInfo [] GetMethods(BindingFlags bindingflas)  :它的參數帶有一些限制 BindingFlags  是一個列舉

列舉成員 [DeclaredOnly,Instance ,Public]   列舉成員的功效應用  在編譯器中應用"."符號後本身賣力不雅察 【信任你很快可以或許懂得】

ParameterInfo[]  GetParameters() 辦法前往一個辦法的參數列表

上面用到的類 MyClass ,為了便利浏覽,我把它折疊了!

class MyClass
    {
        int x;
        int y;
        public MyClass(int i, int j)
        {
            this.x = i;
            this.y = j;
        }
        public int Sum()
        {
            return x + y;
        }
        public bool IsBetween(int i)
        {
            if (x < i && i < y)
            {
                return true;
            }
            return false;
        }
        public void Set(int a, int b)
        {
            x = a;
            y = b;
        }
        public void Set(double a, double b)
        {
            x = (int)a;
            y = (int)b;
        }
        public void Show()
        {
            Console.WriteLine("x: " + x + "  y:  " + y);
        }
    }

MyClass

Main:

Type t = typeof(MyClass);//取得一個表現MyClass類的Type對象
            Console.WriteLine("獲得以後成員的稱號" + t.Name);
            Console.WriteLine("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
            Console.WriteLine("支撐的辦法");
            #region 第一種情勢
            //MethodInfo[] mi = t.GetMethods();//顯示Class類中被支撐的辦法
            // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            //辦法GetMethods() 把 MyClass 的基類 object辦法都顯示出來了
            //上面我們說說  GetMethods() 的別的一種情勢,無限制的顯示
            #endregion
            #region 第二種情勢
            MethodInfo[] mi = t.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public);
            #endregion
            foreach (MethodInfo m in mi)
            {
                //前往後打印出MyClass類中成員的類型(辦法的前往值類型)極端辦法稱號
                Console.Write("  " + m.ReturnType.Name + "  " + m.Name + " (");//ReturnType獲得此辦法的前往類型
                ParameterInfo[] pi = m.GetParameters();//取得辦法的參數
                for (int i = 0; i < pi.Length; i++)
                {
                    Console.Write(pi[i].ParameterType.Name + "   " + pi[i].Name);//ParameterType 獲得該參數的Type(類型)
                    if (i+1<pi.Length)
                    {
                        Console.Write(", ");
                    }

                }
                Console.WriteLine(")");
                Console.WriteLine();
            }       

            Console.ReadKey();

  
應用反射挪用辦法

下面 評論辯論了怎樣獲得一個類型所支撐的辦法,但是為我們獲得對辦法的挪用做了充足的預備!

MethodInfo類中的Invoke() 辦法供給了該技巧!

它的一種情勢:  object Invoke(object  obj,object [] paramenters)

obj 是一個對象援用,將挪用它所指向的對象上的辦法,關於static辦法,obj必需為null。

一切須要傳遞給辦法的參數都必需在parameters數組中指定。假如辦法不須要參數,則paramenters必需為null

基類MethodBase的 Invoke()辦法前往被挪用辦法的前往值

請看上面的事例:

 

MyClass類Set()辦法有所轉變:

public void Set(int a, int b)
        {
Console.WriteLine("Set(int,int)");
x = a;
y = b;
Show();
        }
        public void Set(double a, double b)
        {
Console.WriteLine("Set(double,double)");
x = (int)a;
y = (int)b;
Show();
        }


Type t = typeof(MyClass);
MyClass reflectOb = new MyClass(10, 20);
int val;
Console.WriteLine("Invoke methods in " + t.Name);//挪用MyClass類的辦法
Console.WriteLine();
MethodInfo[] mi = t.GetMethods();

foreach (MethodInfo m in mi)//挪用每一個辦法
{
    //取得辦法參數
    ParameterInfo[] pi = m.GetParameters();
    if (m.Name.Equals("Set",StringComparison.Ordinal)&&pi[0].ParameterType==typeof(int))
    {
        //     指定 System.String.Compare(System.String,System.String) 和 System.String.Equals(System.Object)
        //     辦法的某些重載要應用的區域、年夜小寫和排序規矩。
        //StringComparison.Ordinal   應用序號排序規矩比擬字符串
        object[] obj = new object[2];
        obj[0] = 9;
        obj[1] = 18;
        m.Invoke(reflectOb, obj);
    }
    else if (m.Name.Equals("Set",StringComparison.Ordinal)&&pi[0].ParameterType==typeof(double))
    {
        object[] obj = new object[2];
        obj[0] = 1.12;
        obj[1] = 23.4;
        m.Invoke(reflectOb, obj);
    }
    else if (m.Name.Equals("Sum",StringComparison.Ordinal))
    {
        val = (int)m.Invoke(reflectOb, null);
        Console.WriteLine("Sum is : " + val);
    }
    else if (m.Name.Equals("IsBetween", StringComparison.Ordinal))
    {
        object[] obj = new object[1];
        obj[0] = 14;
        if ((bool)m.Invoke(reflectOb, obj))
        {
Console.WriteLine("14 is between x and y");
        }
    }
    else if (m.Name.Equals("Show",StringComparison.Ordinal))
    {
        m.Invoke(reflectOb,null);
    }
}

Main

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved