基本类型--委托(二)
15.6 C#对委托的支持
15.7对委托链调用进行更多控制
15.7对委托链调用进行更多控制
internal sealed class Light{
public String SwitchPosition() {
return "灯关了";
}
}
internal sealed class Fan{
public String Speed(){
throw new InvalidOperationException("风机因过热而报废");
}
}
internal sealed class Speaker {
public String Volume() {
return "声音很大";
}
}
public sealed class Program
{
//查询以上各个组件状态
private delegate String GetStatus();
public static void Main()
{
GetStatus getstatus = null;
getstatus += new GetStatus(new Light().SwitchPosition);
getstatus += new GetStatus(new Fan().Speed);
getstatus += new GetStatus(new Speaker().Volume);
Console.WriteLine(GetStatusReport(getstatus));
Console.ReadLine();
}
private static String GetStatusReport(GetStatus status)
{
if (status == null) return null;
StringBuilder sb = new StringBuilder();
Delegate[] arrayOfDelegate = status.GetInvocationList();
foreach (GetStatus s in arrayOfDelegate)
{
try
{
sb.AppendFormat("{0}{1}{1}", s(), Environment.NewLine);
}
catch (InvalidOperationException e)
{
Object component = s.Target;
sb.AppendFormat("Failed to get status from{1}{2}{0}Error:{3}{0}{0}",
Environment.NewLine,
((component == null) ? "" : component.GetType() + "."),
s.Method.Name,
e.Message);
}
}
return sb.ToString();
}
}
15.8C#为委托提供的语法便利public String SwitchPosition() {
return "灯关了";
}
}
internal sealed class Fan{
public String Speed(){
throw new InvalidOperationException("风机因过热而报废");
}
}
internal sealed class Speaker {
public String Volume() {
return "声音很大";
}
}
public sealed class Program
{
//查询以上各个组件状态
private delegate String GetStatus();
public static void Main()
{
GetStatus getstatus = null;
getstatus += new GetStatus(new Light().SwitchPosition);
getstatus += new GetStatus(new Fan().Speed);
getstatus += new GetStatus(new Speaker().Volume);
Console.WriteLine(GetStatusReport(getstatus));
Console.ReadLine();
}
private static String GetStatusReport(GetStatus status)
{
if (status == null) return null;
StringBuilder sb = new StringBuilder();
Delegate[] arrayOfDelegate = status.GetInvocationList();
foreach (GetStatus s in arrayOfDelegate)
{
try
{
sb.AppendFormat("{0}{1}{1}", s(), Environment.NewLine);
}
catch (InvalidOperationException e)
{
Object component = s.Target;
sb.AppendFormat("Failed to get status from{1}{2}{0}Error:{3}{0}{0}",
Environment.NewLine,
((component == null) ? "" : component.GetType() + "."),
s.Method.Name,
e.Message);
}
}
return sb.ToString();
}
}
作者:青羽