当涉及泛型类时执行简单事件委托调用时出错
本文关键字:调用 出错 事件 执行 泛型类 简单 | 更新日期: 2023-09-27 18:25:16
以下类别
public class PagedItemList<T>
{
public delegate void PageChanged(int newPage);
public event PageChanged PageChangedEvent;
}
public class SomeClass
{
public void SetupWithPagedList<T>(PagedItemList<T> list)
{
list.PageChangedEvent += new PagedItemList<T>.PageChanged(NotifyPageChanged);
}
public void NotifyPageChanged(int newPage) { }
}
抛出错误:
InvalidCastException:无法从源类型转换为目标类型
当我尝试向事件添加侦听器时,如上面的示例所示。
对SetupWithPagedList的调用参数化正确:
obj.SetupWithPagedList<Monster>(pagedMonstersList)
我以前做过很多活动和委托,这里唯一的区别是这个类中涉及一个<T>
。是否有人在使用模板进行活动和委派时遇到问题?
我认为在这种情况下,您的问题在于实例。当我看到你的PagedItemListCode
时,我提出的第一个问题是,为什么SetupWithPagedList
不是一个静态方法,我检查了你是否在类的实例中调用了NotifyPageChanged
方法。我不知道这个问题背后的逻辑,但也许正确的方法是这样的:
public static void SetupWithPagedList<T>(PagedItemList<T> list)
{
list.PageChangedEvent += new PagedItemList<T>.PageChanged(list.NotifyPageChanged);
}
请注意,类的实例可能与传递给SetupWithPagedList
方法的对象的实例不同。可能类是PagedItemList<A>
,方法参数是PagedItemList<Monster>
。也许类不需要是泛型的。检查一下。
编辑
我试过你的代码,效果很好:
var p = new PagedItemList<int>();
var sc = new SomeClass();
sc.SetupWithPagedList(p);
p.RaisPageChanged(5);
public class PagedItemList<T>
{
public delegate void PageChanged(int newPage);
public event PageChanged PageChangedEvent;
public void RaisPageChanged(int page)
{
if (PageChangedEvent != null)
PageChangedEvent(page);
}
}
public class SomeClass
{
public void SetupWithPagedList<T>(PagedItemList<T> list)
{
list.PageChangedEvent += new PagedItemList<T>.PageChanged(NotifyPageChanged);
}
public void NotifyPageChanged(int newPage)
{
Debug.WriteLine("Page: ",newPage);
}
}
检查一下,也许是别的东西。