以下课程
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>
。是否有人在使用模板进行事件和委托时遇到问题?
答案 0 :(得分:0)
我认为在这种情况下你的问题是实例。我在看到你的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);
}
}
检查一下,也许是别的。