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

时间:2014-09-30 16:30:07

标签: c# events generics

以下课程

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>。是否有人在使用模板进行事件和委托时遇到问题?

1 个答案:

答案 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);
    }
}

检查一下,也许是别的。