在看泛型委托之前还需要先了解委托的概念。
这里讲的委托有两种类型一种是有返回值的,另一种是事件委托。
//
定义有返回值的委托
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);
}
}
}
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)
{
//
}
{
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方法。