zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    Servlet细节
    https协议
    常用css缩写
    Servlet
    计算机编码总结
    java 中 finally 语句块的 深度解析 总结
    使用DIV之后 table何去何从
    http协议
    web开发基础
    js闭包之我见
  • 原文地址:https://www.cnblogs.com/herizai/p/6972201.html
Copyright © 2011-2022 走看看