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)
  • 相关阅读:
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    初识面向对象编程(Object Oriented Programming,OOP)
    详述WebLogic反序列化远程命令执行漏洞的处理过程,云和恩墨技术通讯精选
    分布式监控系统zipkin介绍
    Uncaught TypeError: Cannot set property 'render' of undefined
    python PIL的Image.resize()和Image.thumbnail()函数的区别
    dump 组合索引存储null值
    史上最全MySQL锁机制
    Dump 组合索引
  • 原文地址:https://www.cnblogs.com/herizai/p/6972201.html
Copyright © 2011-2022 走看看