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:反射小知識 【方法篇】