none
我怎么在结构或类中,DIY定义回调函数? RRS feed

  • 问题

  • 我想做一个结构,除了定义Url和网页源代码外,由于不通网页的处理程序不同,我要求“对各网页的实际处理程序”可以被动态定义为各处理函数(可能web1需要被analysis1函数处理,web2需要被WebSave函数处理)。因为他们都有相同的参数形势(string Url, string WebSource),所以我想委托是应该可以实现的。问题1:我能给这个结构的不同实例,在“对各网页的实际处理程序”处赋值不同的函数名吗?

    struct DownloadTask

    {

    public string Url;

    public string WebSource;

    public delegate void 对各网页的实际处理程序(string Url, string WebSource);

    }

    问题2:在我实例struct DownloadTask后(DownloadTask DownloadList = new DownloadTask();),DownloadList.后面找不到这个委托,这是怎么回事?我找不到它,我怎么把我要的函数定义进去?

     

    谢谢!

    2011年6月3日 3:14

答案

  • 服务器不能回调客户端吧。

    没看到你的DownloadList在哪,哪里又委托?DownloadTask 是个类啊。

    你是说对“各网页的实际处理程序”这个委托?委托是什么?委托实际就是一种简化的继承写法。委托实际是继承自多播委托的一个子类型,知道这一点了。哪类比一下

     

    public class a
    {

        public class b{}
    }

     

    你可以写

    a obj = new a();
    a.b...这样么?

     

    所以,你的委托声明需要写

    DownloadTask. 对各网页的实际处理程序 mydel = new ...

     

    至于实现这样的想法,web的我不了解,应该不是这么做的。


    2011 c# mvp China. *George读起来像不像“饺子”?我爱吃饺子,我叫George。
    2011年6月4日 20:04
    版主
  • OpenNovo你好!

    “委托”是用于“同参(个数、类型、顺序和返回值完全一样)的不同函数之间的动态调用。基于这个原理,你完全可以这样做——

    1)在App_Code中创建一个类,叫Delegates,其中专门用于负责声明不同的委托——

    public class Delegates

    {

        public delegate void GeneralCaller(string Url, string WebSource);

        ………………

    }

    2)对于每一个网页,精心设计一个和该委托对应的方法,比如在WebForm1.aspx中——

    public class WebForm1

    {

       ……

       public void DownloadForWebForm1(string Url, string WebSource)

       {

          ………………

       }

    }

    3)设计一个专门用于委托的类(结构),其中参数就是该委托:

    struct DownloadTask

    {

    public string Url;

    public string WebSource;

    public void 对各网页的实际处理程序(Delegates.GeneralCaller caller,string Url, string WebSource)

    {

       ……………………

       //调用

       caller(Url,WebSource);

      ………………………

    }

    }

    4)主页面调用(比如在WebForm1中)

    DownloadTask dl = new DownloadTask();

    dl.对各网页的实际处理程序(DownloadForWebForm1,Url,websource);

    ……………………


    如果你有其它意见或私下交流,请发送邮件到:maledong@qq.com;或者请QQ我
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处
    2011年6月5日 1:06
    版主
  • using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace ConsoleApplication1
    {
      class Program
      {
        static void Main(string[] args)
        {
          // 调用示例
          var d = new DownloadClass(delegate
          {
            Console.WriteLine("Complete");
          });
        }
      }
    
      /// <summary>
      /// 下载完成国回调委托
      /// </summary>
      public delegate void DownloadCallBack();
    
      /// <summary>
      /// 下载示例类
      /// </summary>
      public class DownloadClass
      {
        DownloadCallBack CallBack;
    
        public DownloadClass(DownloadCallBack callBack)
        {
          this.CallBack = callBack;
        }
    
        /// <summary>
        /// 完成下载
        /// </summary>
        protected void DownloadComplete()
        {
          if (this.CallBack != null)
            this.CallBack.Invoke();
        }
      }
    }
    
    

    知识改变命运,奋斗成就人生!
    2011年6月7日 5:14
    版主

全部回复

  • 服务器不能回调客户端吧。

    没看到你的DownloadList在哪,哪里又委托?DownloadTask 是个类啊。

    你是说对“各网页的实际处理程序”这个委托?委托是什么?委托实际就是一种简化的继承写法。委托实际是继承自多播委托的一个子类型,知道这一点了。哪类比一下

     

    public class a
    {

        public class b{}
    }

     

    你可以写

    a obj = new a();
    a.b...这样么?

     

    所以,你的委托声明需要写

    DownloadTask. 对各网页的实际处理程序 mydel = new ...

     

    至于实现这样的想法,web的我不了解,应该不是这么做的。


    2011 c# mvp China. *George读起来像不像“饺子”?我爱吃饺子,我叫George。
    2011年6月4日 20:04
    版主
  • OpenNovo你好!

    “委托”是用于“同参(个数、类型、顺序和返回值完全一样)的不同函数之间的动态调用。基于这个原理,你完全可以这样做——

    1)在App_Code中创建一个类,叫Delegates,其中专门用于负责声明不同的委托——

    public class Delegates

    {

        public delegate void GeneralCaller(string Url, string WebSource);

        ………………

    }

    2)对于每一个网页,精心设计一个和该委托对应的方法,比如在WebForm1.aspx中——

    public class WebForm1

    {

       ……

       public void DownloadForWebForm1(string Url, string WebSource)

       {

          ………………

       }

    }

    3)设计一个专门用于委托的类(结构),其中参数就是该委托:

    struct DownloadTask

    {

    public string Url;

    public string WebSource;

    public void 对各网页的实际处理程序(Delegates.GeneralCaller caller,string Url, string WebSource)

    {

       ……………………

       //调用

       caller(Url,WebSource);

      ………………………

    }

    }

    4)主页面调用(比如在WebForm1中)

    DownloadTask dl = new DownloadTask();

    dl.对各网页的实际处理程序(DownloadForWebForm1,Url,websource);

    ……………………


    如果你有其它意见或私下交流,请发送邮件到:maledong@qq.com;或者请QQ我
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处
    2011年6月5日 1:06
    版主
  • 我的设计,这些都是客户端的;我只是想下载多个网页,并对不同网页实施不同操作。

    另,“DownloadTask. 对各网页的实际处理程序”,这个没能显示出来,如果可以的话,我也知道要用new来定义。但vs2010貌似没有显示出来,所以我怀疑我这样写是否有误。

     

    2011年6月5日 13:11
  • 您好,请看看并且尝试我的代码。

    或者列出您的代码让我们看看。

    谢谢。


    如果你有其它意见或私下交流,请发送邮件到:maledong@qq.com;或者请QQ我
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处
    2011年6月6日 0:13
    版主
  • using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace ConsoleApplication1
    {
      class Program
      {
        static void Main(string[] args)
        {
          // 调用示例
          var d = new DownloadClass(delegate
          {
            Console.WriteLine("Complete");
          });
        }
      }
    
      /// <summary>
      /// 下载完成国回调委托
      /// </summary>
      public delegate void DownloadCallBack();
    
      /// <summary>
      /// 下载示例类
      /// </summary>
      public class DownloadClass
      {
        DownloadCallBack CallBack;
    
        public DownloadClass(DownloadCallBack callBack)
        {
          this.CallBack = callBack;
        }
    
        /// <summary>
        /// 完成下载
        /// </summary>
        protected void DownloadComplete()
        {
          if (this.CallBack != null)
            this.CallBack.Invoke();
        }
      }
    }
    
    

    知识改变命运,奋斗成就人生!
    2011年6月7日 5:14
    版主

  • using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace ConsoleApplication1
    {
     class Program
     {
      static void Main(string[] args)
      {
       // 调用示例
       var d = new DownloadClass(delegate
       {
        Console.WriteLine("Complete");
       });
      }
     }
    
     /// <summary>
     /// 下载完成国回调委托
     /// </summary>
     public delegate void DownloadCallBack();
    
     /// <summary>
     /// 下载示例类
     /// </summary>
     public class DownloadClass
     {
      DownloadCallBack CallBack;
    
      public DownloadClass(DownloadCallBack callBack)
      {
       this.CallBack = callBack;
      }
    
      /// <summary>
      /// 完成下载
      /// </summary>
      protected void DownloadComplete()
      {
       if (this.CallBack != null)
        this.CallBack.Invoke();
      }
     }
    }
    
    

    知识改变命运,奋斗成就人生!

    我用你的方式,做成了。

     

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net;
    using System.IO;
    
    namespace CallBackTest
    {
      class Program
      {
        static void Main(string[] args)
        {
          var d=new DownloadClass (Print);
          d.Get("http://cn.bing.com");
    
          Console.ReadLine();
          // end static void Main(string[] args)
        }
    
        static void Print(string url, string source)
        {
          Console.WriteLine(url);
          Console.WriteLine(source);
        }
        // end class Program
      }
    
      public delegate void DownloadCallBack(string url,string source);
      public class DownloadClass
      {
        DownloadCallBack CallBack;
    
        public DownloadClass(DownloadCallBack cllbk)
        {
          this.CallBack = cllbk;
        }
    
        public void Get(string Url)
        {
          string Source = "";
    
          WebClient client = new WebClient();
          StreamReader sr = new StreamReader(client.OpenRead(Url), Encoding.Default);
          Source = sr.ReadToEnd();
    
          if (this.CallBack != null)
            this.CallBack.Invoke(Url, Source);
          // end public string Get(string Url)
        }
        // end public class DownloadClass
      }
      // end namespace CallBackTest
    }
    

    2011年6月9日 9:04