MethodBase.GetCurrentMethod 方法
如果當前正在執行的方法定義泛型類型上MethodInfo返回GetCurrentMethod通過泛型類型定義 (即,MethodInfo.ContainsGenericParameters返回true)。?因此,它不反映時調用該方法時所使用的類型自變量。?例如,如果方法M()泛型類型上定義C<T>(C(Of T)在 Visual Basic 中),和GetCurrentMethod從調用C<string>.M(),然后GetCurrentMethod返回C<T>.M()(C(Of T).M()在 Visual Basic 中)。
如果當前正在執行的方法是泛型方法,GetCurrentMethod返回泛型方法定義。?如果在泛型類型上定義的泛型方法MethodInfo從泛型類型定義中獲取。
示例下面的示例定義兩種類型。?第一種是一個非泛型類,?TestClass,包括構造函數,一個名為方法GetValue,和一個名為的讀寫屬性GetValue。?第二個是名為一個泛型類TestClass<T>,包含一個構造函數,GetValue方法和泛型方法,?ConvertValue<Y>。?每個構造函數、 方法和屬性訪問器包括對的調用GetCurrentMethod方法。
------------------------------------------------------
using System; using System.Reflection;public class Example {public static void Main(){var t = new TestClass(); Console.WriteLine(t.GetValue());t.Value = 10;Console.WriteLine(t.Value);Console.WriteLine();var tg =new Test<int>(200);Console.WriteLine(tg.GetValue());var b = tg.ConvertValue<Byte>();Console.WriteLine("{0} -> {1} ({2})", tg.GetValue().GetType().Name,b, b.GetType().Name);} } public class TestClass {private Nullable<int> _value;public TestClass(){MethodBase m = MethodBase.GetCurrentMethod();Console.WriteLine("Executing {0}.{1}", m.ReflectedType.Name, m.Name);}public TestClass(int value){MethodBase m = MethodBase.GetCurrentMethod();Console.WriteLine("Executing {0}.{1}", m.ReflectedType.Name, m.Name);_value = value;}public int Value{ get {MethodBase m = MethodBase.GetCurrentMethod();Console.WriteLine("Executing {0}.{1}", m.ReflectedType.Name, m.Name);return _value.GetValueOrDefault();}set {MethodBase m = MethodBase.GetCurrentMethod();Console.WriteLine("Executing {0}.{1}", m.ReflectedType.Name, m.Name);_value = value;}}public int GetValue(){MethodBase m = MethodBase.GetCurrentMethod();Console.WriteLine("Executing {0}.{1}", m.ReflectedType.Name, m.Name);return this.Value;} }public class Test<T> {private T value;public Test(T value){MethodBase m = MethodBase.GetCurrentMethod();Console.WriteLine("Executing {0}.{1}", m.ReflectedType.Name, m.Name);this.value = value;}public T GetValue(){MethodBase m = MethodBase.GetCurrentMethod();Console.WriteLine("Executing {0}.{1}", m.ReflectedType.Name, m.Name);return value;}public Y ConvertValue<Y>() {MethodBase m = MethodBase.GetCurrentMethod();Console.WriteLine("Executing {0}.{1}", m.ReflectedType.Name, m.Name);Console.Write(" Generic method: {0}, definition: {1}, Args: ", m.IsGenericMethod, m.IsGenericMethodDefinition);if (m.IsGenericMethod) {foreach (var arg in m.GetGenericArguments())Console.Write("{0} ", arg.Name);}Console.WriteLine();try {return (Y) Convert.ChangeType(value, typeof(Y));}catch (OverflowException) {throw; } catch (InvalidCastException) {throw;} } } // The example displays the following output: // Executing TestClass..ctor // Executing TestClass.GetValue // Executing TestClass.get_Value // 0 // Executing TestClass.set_Value // Executing TestClass.get_Value // 10 // // Executing Test`1..ctor // Executing Test`1.GetValue // 200 // Executing Test`1.ConvertValue // Generic method: True, definition: True, Args: Y // Executing Test`1.GetValue // Int32 -> 200 (Byte)?
轉載于:https://www.cnblogs.com/herizai/p/6972201.html
總結
以上是生活随笔為你收集整理的MethodBase.GetCurrentMethod 方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JFinal配合Shiro权限控制在Fr
- 下一篇: 关于python2和python3除法的