⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 invoker.cs

📁 Microsoft.NET.框架程序设计修订版中的书中源码
💻 CS
字号:
/******************************************************************************
Module:  Invoker.cs
Notices: Copyright (c) 2002 Jeffrey Richter
******************************************************************************/


// Comment out the line below to test
// bind and invoke as separate steps
#define BindAndInvokeTogether


///////////////////////////////////////////////////////////////////////////////


using System;
using System.Reflection;
using System.Threading;


///////////////////////////////////////////////////////////////////////////////


// This class is used to demonstrate reflection
// It has a field, constructor, method, property, and an event
class SomeType {
   Int32 someField;
   public SomeType(ref Int32 x) { x *= 2; }
   public override String ToString() { return someField.ToString(); }
   public Int32 SomeProp {
      get { return someField; }
      set { 
         if (value < 1) 
            throw new ArgumentOutOfRangeException(
               "value", value, "value must be > 0");
         someField = value;
      }
   }
   public event ThreadStart SomeEvent;
   private void NoCompilerWarnings() {
      SomeEvent.ToString();
   }
}


///////////////////////////////////////////////////////////////////////////////


class App {
   static void Main() {
      Type t = typeof(SomeType);
      BindingFlags bf = BindingFlags.DeclaredOnly | 
         BindingFlags.Public | BindingFlags.NonPublic | 
         BindingFlags.Instance;

      #if BindAndInvokeTogether

      // Construct an instance of the Type
      Object[] args = new Object[] { 12 };  // Constructor arguments
      Console.WriteLine("x before constructor called: " + args[0]);
      Object obj = t.InvokeMember(null, 
         bf | BindingFlags.CreateInstance, null, null, args);
      Console.WriteLine("Type: " + obj.GetType().ToString());
      Console.WriteLine("x after constructor returns: " + args[0]);

      // Read and write to a field
      t.InvokeMember("someField", 
         bf | BindingFlags.SetField, null, obj, new Object[] { 5 });
      Int32 v = (Int32) t.InvokeMember("someField", 
         bf | BindingFlags.GetField, null, obj, null);
      Console.WriteLine("someField: " + v);

      // Call a method
      String s = (String) t.InvokeMember("ToString", 
         bf | BindingFlags.InvokeMethod, null, obj, null);
      Console.WriteLine("ToString: " + s);

      // Read and write a property
      try {
         t.InvokeMember("SomeProp", 
            bf | BindingFlags.SetProperty, null, obj, new Object[] { 0 });
      } 
      catch (TargetInvocationException e) {
         if (e.InnerException.GetType() != 
            typeof(ArgumentOutOfRangeException)) 
            throw;
         Console.WriteLine("Property set catch.");
      }
      t.InvokeMember("SomeProp", 
         bf | BindingFlags.SetProperty, null, obj, new Object[] { 2 });
      v = (Int32) t.InvokeMember("SomeProp", 
         bf | BindingFlags.GetProperty, null, obj, null);
      Console.WriteLine("SomeProp: " + v);

      // NOTE: InvokeMember doesn't support events

      #else

      // Construct an instance
      ConstructorInfo ctor = t.GetConstructor(
         new Type[] { Type.GetType("System.Int32&") });
      Object[] args = new Object[] { 12 };  // Constructor arguments
      Console.WriteLine("x before constructor called: " + args[0]);
      Object obj = ctor.Invoke(args);
      Console.WriteLine("Type: " + obj.GetType().ToString());
      Console.WriteLine("x after constructor returns: " + args[0]);

      // Read and write to a field
      FieldInfo fi = obj.GetType().GetField("someField", bf);
      fi.SetValue(obj, 33);
      Console.WriteLine("someField: " + fi.GetValue(obj));

      // Call a method
      MethodInfo mi = obj.GetType().GetMethod("ToString", bf);
      String s = (String) mi.Invoke(obj, null);
      Console.WriteLine("ToString: " + s);

      // Read and write a property
      PropertyInfo pi = 
         obj.GetType().GetProperty("SomeProp", typeof(Int32));
      foreach (MethodInfo m in pi.GetAccessors())
         Console.WriteLine(m);
      try {
         pi.SetValue(obj, 0, null);
      } 
      catch (TargetInvocationException e) {
         if (e.InnerException.GetType() != 
            typeof(ArgumentOutOfRangeException)) 
            throw;
         Console.WriteLine("Property set catch.");
      }
      pi.SetValue(obj, 2, null);
      Console.WriteLine("SomeProp: " + pi.GetValue(obj, null));

      // Add and remove a delegate from the event
      EventInfo ei = obj.GetType().GetEvent("SomeEvent", bf);
      Console.WriteLine("AddMethod: "        + ei.GetAddMethod());
      Console.WriteLine("RemoveMethod: "     + ei.GetRemoveMethod());
      Console.WriteLine("EventHandlerType: " + ei.EventHandlerType);

      ThreadStart ts = new ThreadStart(Main);
      ei.AddEventHandler(obj, ts);
      ei.RemoveEventHandler(obj, ts);

      #endif

      Console.WriteLine("Press <Enter> to exit.");
      Console.ReadLine();
   }
}


//////////////////////////////// End of File //////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -