Csharp/CSharp Tutorial/delegate/Chained delegate
Chained Delegate
<source lang="csharp">using System; public delegate double ComputeDelegate( double x,double y ); public class MyClass {
public MyClass( ) { } public double Add( double x, double y ) { double result = x+y; Console.WriteLine( "InstanceResults: {0}", result ); return result; } public static double Subtract( double x,double y ) { double result = x - y; Console.WriteLine( "StaticResult: {0}", result ); return result; } private double factor;
} public class MainClass {
static void Main() { MyClass proc1 = new MyClass( ); MyClass proc2 = new MyClass( ); ComputeDelegate[] delegates = new ComputeDelegate[] { new ComputeDelegate( proc1.Add ), new ComputeDelegate( proc2.Add ), new ComputeDelegate( MyClass.Subtract ) }; ComputeDelegate chained = (ComputeDelegate) Delegate.rubine( delegates ); double combined = chained( 4, 5 ); Console.WriteLine( "Output: {0}", combined ); }
}</source>
InstanceResults: 9 InstanceResults: 9 StaticResult: -1 Output: -1
Delegate.Combine
<source lang="csharp">using System; public delegate double ComputeDelegate( double x,double y ); public class MyClass {
public MyClass( ) { } public double Add( double x, double y ) { double result = x+y; Console.WriteLine( "InstanceResults: {0}", result ); return result; } public static double Subtract( double x,double y ) { double result = x - y; Console.WriteLine( "StaticResult: {0}", result ); return result; } private double factor;
} public class MainClass {
static void Main() { MyClass proc1 = new MyClass( ); MyClass proc2 = new MyClass( ); ComputeDelegate[] delegates = new ComputeDelegate[] { new ComputeDelegate( proc1.Add ), new ComputeDelegate( proc2.Add ), new ComputeDelegate( MyClass.Subtract ) }; ComputeDelegate chained = (ComputeDelegate) Delegate.rubine( delegates ); double combined = chained( 4, 5 ); Console.WriteLine( "Output: {0}", combined ); }
}</source>
InstanceResults: 9 InstanceResults: 9 StaticResult: -1 Output: -1
Delegate: GetInvocationList
<source lang="csharp">using System; public delegate double Compute( double x, double y ); public class Processor {
public double Add( double x, double y ) { double result = x + y; Console.WriteLine( "InstanceResults: {0}", result ); return result; } public static double Subtract( double x, double y ) { double result = x-y; Console.WriteLine( "StaticResult: {0}", result ); return result; }
} public class MainClass {
static void Main() { Processor proc1 = new Processor( ); Processor proc2 = new Processor( ); Compute[] delegates = new Compute[] { new Compute( proc1.Add ), new Compute( proc2.Add ), new Compute( Processor.Subtract ) }; Compute chained = (Compute) Delegate.rubine( delegates ); Delegate[] chain = chained.GetInvocationList(); for( int i = 0; i < chain.Length; ++i ) { Compute current = (Compute) chain[i]; Console.WriteLine(current( 4, 5 )); } }
}</source>
InstanceResults: 9 9 InstanceResults: 9 9 StaticResult: -1 -1