深入解析C#编程中泛型委托的使用

2019-12-26 17:30:12于海丽
易采站长站为您分析C#编程中泛型委托的使用,引用泛型委托的代码可以指定类型参数以创建已关闭的构造类型,需要的朋友可以参考下  

在看泛型委托之前还需要先了解委托的概念。
这里讲的委托有两种类型一种是有返回值的,另一种是事件委托。


  //定义有返回值的委托 
  public delegate string GenricDelegate<T, S>(T title, S author);

  //定义事件委托。
  public delegate void GenricDelegateEnent<E,P>(E Name,P Address);

  public class GenericDelegateClass<V,F>
  {
    //声明委托
    public GenricDelegate<V, F> GdeleValue;
    //声明事件委托
    public event GenricDelegateEnent<V, F> GdEvent = null;

    public string GetValues(V title, F author)
    {
      //调用委托
      return GdeleValue(title, author);
    }

    public GenericDelegateClass()
    {
    }

    public void InvokeEvent(V name, F address)
    {
      if (GdEvent != null)
      {
        //调用委托
        GdEvent(name, address);
      }
    }
  }

上面我们定义及调用了泛型委托,接下来就来梆定委托。


    private void btnDelegate_Click(object sender, EventArgs e)
    {

      GenericDelegateClass<string, string> gd = new GenericDelegateClass<string, string>();
      //将DelegateReturn事件梆定给GdeleValue
      gd.GdeleValue = new GenricDelegate<string, string>(DelegateReturn);
      //将GenericEvent事件梆定给GdEvent
      gd.GdEvent += new GenricDelegateEnent<string, string>(GenericEvent<string,string>);
    }

    public string DelegateReturn<T,S>(T title,S author)
    {
      return title.ToString() + author;
    }

    private void GenericEvent<V, F>(V name, F address)
    {
      //
    }

在这里我们看到我在梆定DelegateReturn的时候并没有带泛型参数。在这里的泛型参数其实是没什么意义的。因为他的类型取决于调用委托的方法的类型。也就是在前面那段代码中InvokeEvent方法的类型,这里的DelegateReturn要用泛型方法是可以随时跟InvokeEvent的参数类型保持一至。这样梆定后我们再来调用gd.GetValues("my generic post","fastyou");这样调用的其实就是DelegateReturn的方法,这就是委托的好处了,同样调用gd.InvokeEvent("my generic post","fastyou");就是GenericEvent方法。

委托 可以定义自己的类型参数。引用泛型委托的代码可以指定类型参数以创建已关闭的构造类型,就像实例化泛型类或调用泛型方法一样,如下例所示:


public delegate void Del<T>(T item);
public static void Notify(int i) { }

Del<int> m1 = new Del<int>(Notify);