反射小知識 【方法篇】

reflect_method

場景:

在方法定義時,我們有可能使用到 in/out/ref 這些關鍵字 來定義參數

in表示只讀引用 -- 此特性出現在C# 7.2  由於此處使用的爲C# 7.0 不進行測試說明

那麼我們如何在反射中進行區分呢?

代碼:

        var type = typeof(Program);

        var method = type.GetMethods();

        foreach (var methodInfo in method)
        {

            Console.WriteLine($"{methodInfo.Name}>>>");

            foreach (var parameterInfo in methodInfo.GetParameters())
            {

                var paramType = parameterInfo.ParameterType;//out 參數返回String& params 則是返回object[]
                Console.WriteLine(paramType);
            }

            Console.WriteLine("---------------------------");

        }

通過調試可知》

使用這些關鍵字定義參數時,反射獲取的Type爲System.String& 即 System.String ByRef

獲取方法

在方法的定義時 你可能通過重載定義瞭如下兩個方法:

    public void Work(ref string confirm)//方法A
    {
        confirm = string.Empty;
    }

    public void Work(string confirm)//方法B
    {
        confirm = string.Empty;
    }

常見的獲取方法:

    //創建方法參數所對應的Type數組
    Type[] types = new Type[] { typeof(string)};

    //通過參數列表對應的type和方法名  當然還有其他的篩選條件,例如:是否爲public/static等等
    var info = type.GetMethod("Work",types);

那麼如何通過上述的這種方式來獲取方法A?

解決方法:

Type[] types = new Type[] { typeof(string).MakeByRefType()};

通過MakeByRefType便可指定此參數爲ref/out/in便能獲取到方法A了,so easy 對吧

question 1

那如果獲取了一個帶有out/ref/in參數的方法,如何進行調用?

解決方法:

在調用時,傳遞object[]時不進行傳值而是傳遞變量,調用後再使用變量繼續後面的操作,就可以了

回顧

ref/out/in 常用於值類型的傳入

因爲值類型參數與引用類型的一起區別是

在方法內發現改變的時,變量值不發生改變  

當然,引用類型,如果在方法內重新指定引用類型,方法調用後也不會發生改變的

根據vs 提示 在C# 7.2 引入的in 是用於只讀參數的傳遞()

在此前的版本中由(Tuple<T1,T2...> readOnlyParam)來充當只讀參數

ref 的作用則是用於保障方法調用時的修改會同步到方法調用後

out 與ref的作用類型類型,不過out作爲參數時,此參數的值必須在方法中進行改變,且在方法內若使用了反射調用其他方法時,
也需要在改變此參數後進行傳遞

例如:

 List<object> invokeParam = new List<object>();
            invokeParam.Add(confirm);//error : 使用了未賦值的out 參數

擴展

在反射時 ref與out參數對應的type都是在原有類型上MakeByRefType後type 可見ref與out具有相似性

在ParameterInfo中 存在一個屬性IsOut 通過調試可知

out 參數  >>  true
ref 參數  >>  false

out/in除了修飾參數外,還可以修飾泛型 》》 由於內容較多,請參考逆變與協變進行理解


author:monster

since:6/27/2018 5:41:26 PM

direction:反射小知識 【方法篇】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章