当涉及泛型类时执行简单事件委托调用时出错

本文关键字:调用 出错 事件 执行 泛型类 简单 | 更新日期: 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);
    }
}

检查一下,也许是别的东西。