基本类型--委托(二)

 156 C#对委托的支持

157对委托链调用进行更多控制

 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 == nullreturn 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();
        }

    }
158C#为委托提供的语法便利
posted @ 2008-05-27 15:26  青羽  阅读(562)  评论(0编辑  收藏  举报