最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c#反射調(diào)用方法示例

 更新時間:2014年04月15日 11:51:00   作者:  
這篇文章主要介紹了c#反射調(diào)用方法示例,需要的朋友可以參考下

獲取方法的相關(guān)信息的兩種形式

反射是一種允許用戶獲得類信息的C#功能,Type對象映射它代表的底層對象;

在.Net 中, 一旦獲得了Type對象,就可以使用GetMethods()方法獲取此類型支持的方法列表;該方法的兩種形式:

MethodInfo [] GetMethods()

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

枚舉成員 [DeclaredOnly,Instance ,Public]   枚舉成員的功能使用  在編譯器中使用"."符號后自己認(rèn)真觀察 【相信你很快能夠理解】

ParameterInfo[]  GetParameters() 方法返回一個方法的參數(shù)列表

下面用到的類 MyClass ,為了方便閱讀,我把它折疊了!

復(fù)制代碼 代碼如下:

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:

復(fù)制代碼 代碼如下:

Type t = typeof(MyClass);//獲得一個表示MyClass類的Type對象
            Console.WriteLine("獲取當(dāng)前成員的名稱" + 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();//獲得方法的參數(shù)
                for (int i = 0; i < pi.Length; i++)
                {
                    Console.Write(pi[i].ParameterType.Name + "   " + pi[i].Name);//ParameterType 獲取該參數(shù)的Type(類型)
                    if (i+1<pi.Length)
                    {
                        Console.Write(", ");
                    }

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

            Console.ReadKey();

  
使用反射調(diào)用方法

上面 討論了怎么獲取一個類型所支持的方法,然而為我們獲取對方法的調(diào)用做了充分的準(zhǔn)備!

MethodInfo類中的Invoke() 方法提供了該技能!

它的一種形式:  object Invoke(object  obj,object [] paramenters)

obj 是一個對象引用,將調(diào)用它所指向的對象上的方法,對于static方法,obj必須為null。

所有需要傳遞給方法的參數(shù)都必須在parameters數(shù)組中指定。如果方法不需要參數(shù),則paramenters必須為null

基類MethodBase的 Invoke()方法返回被調(diào)用方法的返回值

請看下面的事例:

 

MyClass類Set()方法有所改變:

復(fù)制代碼 代碼如下:

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();
        }

復(fù)制代碼 代碼如下:

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

foreach (MethodInfo m in mi)//調(diào)用每個方法
{
    //獲得方法參數(shù)
    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)
        //     方法的某些重載要使用的區(qū)域、大小寫和排序規(guī)則。
        //StringComparison.Ordinal   使用序號排序規(guī)則比較字符串
        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

相關(guān)文章

  • 將數(shù)組中指定數(shù)量的元素移動數(shù)組后面的實現(xiàn)代碼

    將數(shù)組中指定數(shù)量的元素移動數(shù)組后面的實現(xiàn)代碼

    本篇文章是對將數(shù)組中指定數(shù)量的元素移動數(shù)組后面的實現(xiàn)代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • C#程序中類數(shù)量對程序啟動的影響詳解

    C#程序中類數(shù)量對程序啟動的影響詳解

    這篇文章主要給大家介紹了關(guān)于C#程序中類數(shù)量對程序啟動的影響的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10
  • C# log4net 日志輸出的實現(xiàn)示例

    C# log4net 日志輸出的實現(xiàn)示例

    本文主要介紹了C# log4net 日志輸出的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • c# 實現(xiàn)輪詢算法實例代碼

    c# 實現(xiàn)輪詢算法實例代碼

    這篇文章主要介紹了c# 實現(xiàn)輪詢算法實例代碼的相關(guān)資料,這里附有實例代碼,具有一定的參考價值,需要的朋友可以參考下
    2016-12-12
  • C#使用WinRar命令進(jìn)行壓縮和解壓縮操作的實現(xiàn)方法

    C#使用WinRar命令進(jìn)行壓縮和解壓縮操作的實現(xiàn)方法

    這篇文章主要介紹了C#使用WinRar命令進(jìn)行壓縮和解壓縮操作的實現(xiàn)方法,涉及C#基于Process類操作WinRar命令的相關(guān)實現(xiàn)技巧,代碼簡潔實用,需要的朋友可以參考下
    2016-06-06
  • C#.NET學(xué)習(xí)筆記5 C#中的條件編譯

    C#.NET學(xué)習(xí)筆記5 C#中的條件編譯

    條件編譯是C#比Java多出的東西,但我跟前輩請教后,他們都說條件編譯在實際的項目開發(fā)中不怎么使用.鑒于是新內(nèi)容,我還是做做筆記,理解一下好了
    2012-11-11
  • Unity Shader實現(xiàn)裁切效果

    Unity Shader實現(xiàn)裁切效果

    這篇文章主要為大家詳細(xì)介紹了Unity Shader實現(xiàn)裁切效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C#使用虛擬方法實現(xiàn)多態(tài)

    C#使用虛擬方法實現(xiàn)多態(tài)

    這篇文章主要介紹了C#使用虛擬方法實現(xiàn)多態(tài),涉及C#多態(tài)的實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-05-05
  • c#批量抓取免費代理并且驗證有效性的實戰(zhàn)教程

    c#批量抓取免費代理并且驗證有效性的實戰(zhàn)教程

    突破反爬蟲限制的方法之一就是多用幾個代理IP,下面這篇文章主要給大家介紹了關(guān)于利用c#批量抓取免費代理并且驗證有效性的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-07-07
  • C#中GridView動態(tài)添加列的實現(xiàn)方法

    C#中GridView動態(tài)添加列的實現(xiàn)方法

    這篇文章主要介紹了C#中GridView動態(tài)添加列的實現(xiàn)方法,涉及C#中GridView的相關(guān)使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07

最新評論

介休市| 邹平县| 泾阳县| 同江市| 通辽市| 郴州市| 海林市| 望城县| 隆尧县| 黄大仙区| 南部县| 松阳县| 治多县| 诸暨市| 云南省| 丹阳市| 微山县| 海晏县| 温州市| 婺源县| 辰溪县| 肇庆市| 南雄市| 砚山县| 六枝特区| 应用必备| 文山县| 丽江市| 禹州市| 宣城市| 山西省| 太白县| 肥乡县| 荔波县| 永平县| 枣阳市| 垣曲县| 定结县| 芦溪县| 图们市| 德令哈市|