Csharp/CSharp Tutorial/Reflection/Delegate

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

Create Delegate using reflection

<source lang="csharp">using System; using System.Reflection; using System.Collections.Generic; delegate void ComputeDelegate( Employee emp, Decimal percent ); public class Employee {

   public Decimal Salary;
   public Employee( Decimal salary ) {
       this.Salary = salary;
   }
   public void ApplyRaiseOf( Decimal percent ) {
       Salary *= (1 + percent);
   }

} public class MainClass {

   static void Main() {
       List<Employee> employees = new List<Employee>();
       employees.Add( new Employee(20) );
       employees.Add( new Employee(50) );
       MethodInfo mi = typeof(Employee).GetMethod( "ApplyRaiseOf", BindingFlags.Public | BindingFlags.Instance );
       ComputeDelegate applyRaise = (ComputeDelegate ) Delegate.CreateDelegate( typeof(ComputeDelegate), mi );
       foreach( Employee e in employees ) {
           applyRaise( e, (Decimal) 0.10 );
           Console.WriteLine( e.Salary );
       }
   }

}</source>

22.0
55.0

Get event from Type

<source lang="csharp">using System; using System.Reflection; using System.Windows.Forms;

 public class Class1
 {
     static void Main( string[] args )
     {
       Type type = typeof(MyClass);
       object o = Activator.CreateInstance(type);
       
           EventInfo eventInfo = type.GetEvent("Changed");
       eventInfo.AddEventHandler(o, new EventHandler(Class1.OnChanged));
           ((MyClass)o).Text = "New Value";
     }
     private static void OnChanged(object sender , System.EventArgs e)
     {
       Console.WriteLine(((MyClass)sender).Text);
     }
 }
 public class MyClass
 {
   private string text;
   
   public string Text
   {
     get{ return text; }
     set
     { 
       text = value;
       OnChanged(); 
     }
   }
   
   private void OnChanged()
   {
     if( Changed != null )
       Changed(this, System.EventArgs.Empty); 
   }
   
   public event EventHandler Changed;
 }</source>

Get/set private field using InvokeMember

<source lang="csharp">using System; using System.Reflection; using System.Windows.Forms;

 public class Class1
 {
     static void Main( string[] args )
     {
       Type type = typeof(MyClass);
       object o = Activator.CreateInstance(type);
       
       type.InvokeMember("text", BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Instance, null, o, new object[]{"C#"});
       string text = (string)type.InvokeMember("text", BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance, null, o, new object[]{});
      
     }
     private static void OnChanged(object sender , System.EventArgs e)
     {
       Console.WriteLine(((MyClass)sender).Text);
     }
 }
 public class MyClass
 {
   private string text;
   
   public string Text
   {
     get{ return text; }
     set
     { 
       text = value;
       OnChanged(); 
     }
   }
   
   private void OnChanged()
   {
     if( Changed != null )
       Changed(this, System.EventArgs.Empty); 
   }
   
   public event EventHandler Changed;
 }</source>