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);
}
}
}
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方法。