Csharp/CSharp Tutorial/Reflection/Delegate
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>