C# 在事件中使用具有自定义参数的委托

C# 在事件中使用具有自定义参数的委托,c#,events,delegates,C#,Events,Delegates,我的代码如下所示。我遇到的问题是,代码的这一部分给出了一个编译错误 Changed(this, new ListChangedEventArgs(Operation.Add, e.Value, 1)); 使用泛型类型“CustomDatastructures.Core.ListChangedEventArgs”时出现错误1,需要1个类型参数 第二个问题是如何调用onChanged方法 //公共委托无效列表已更改(对象发送方,TEventArgs e); 更改前公共委托无效(对象发送方,TEv

我的代码如下所示。我遇到的问题是,代码的这一部分给出了一个编译错误

Changed(this, new ListChangedEventArgs(Operation.Add, e.Value, 1));
使用泛型类型“CustomDatastructures.Core.ListChangedEventArgs”时出现错误1,需要1个类型参数

第二个问题是如何调用onChanged方法


//公共委托无效列表已更改(对象发送方,TEventArgs e);
更改前公共委托无效(对象发送方,TEventArgs e);
公共委托无效列表已更改(对象发送方,TEventArgs e);
//通过向类中添加类型参数使该类成为泛型
公共类可观察列表:IEnumerable
{
//声明要用作的私有变量
//列表的内部数据存储
List observerList=新列表();
公共事件列表已更改;
//变更前公共事件列表变更前;
已更改受保护的虚拟void(对象发送方、操作op、T值、int计数)
{
如果(已更改!=null)
已更改(此,新ListChangedEventArgs(op,value,count));
}
/// 
///将对象添加到列表中
/// 
///物件
公共作废新增(T项)
{
添加(项目);
OnChanged(此,Operation.Add,item,1);
}
这是ListChangedEvent类的定义

public class ListChangedEventArgs<T> : EventArgs
{
public int Count { get; }
public Operation Operation { get; }
public T Value { get; }
public ListChangedEventArgs(Operation operation, T value, int count)
}

公共类ListChangedEventArgs:EventArgs
{
公共整数计数{get;}
公共操作操作{get;}
公共T值{get;}
公共ListChangedEventArgs(操作、T值、整数计数)
}

您正在声明类型为
T
ObservableCollection
。此集合有一个事件
ListChanged
。但是您调用此事件时,就好像它是
ListChanged
。因此您必须更改事件的声明:

public event ListChanged<ListChangedEventArgs<T>> Changed;
protected virtual void OnChanged(object sender, ListChangedEventArgs<T> e)
{
    if (Changed != null)
        Changed(this, e);
}
公共事件列表已更改;
已更改受保护的虚拟void(对象发送方,ListChangedEventArgs e)
{
如果(已更改!=null)
改变(本,e);
}

您是否尝试过解析
e
?如下:
更改(this,e);
这样做会产生以下结果:错误2参数2:无法从'System.EventArgs'转换为'T'。我正在尝试在custome events类中使用此构造函数。public ListChangedEventArgs(Operation Operation,T value,int count)可能您只是在寻找类似于
public delegate void ListChanged(object sender,EventArgs e);
的东西;您会得到异常,因为
ListChangedEventArgs
本身不是
T
,因为
Changed
的第二个参数必须是
T
。public class ListChangedEventArgs:EventArgs{public int Count{get;}public Operation Operation{get;}public T Value{get;}public listchangedventargs(Operation Operation,T Value,int Count)}使用非新实例版本将生成此编译器错误:错误1非泛型类型“System.EventArgs”不能与类型一起使用arguments@user2130951请使用调用OnChanged的代码或OnChanged应该处理的事件的事件声明更新您的问题。非常好,这让我了解了问题编号一个。问题2现在在问题中。@user2130951更改的事件仍然声明为ListChanged而不是ListChanged。让我们
public event ListChanged<ListChangedEventArgs<T>> Changed;
protected virtual void OnChanged(object sender, ListChangedEventArgs<T> e)
{
    if (Changed != null)
        Changed(this, e);
}