我試圖用自定義參數在接口中指定一個事件。我需要事件參數是一個對象。我試圖儘可能去除下面的代碼。我目前得到以下錯誤。C#使用自定義參數的繼承事件
ArgumentNullException: Argument cannot be null.
Parameter name: obj
LittleObject.IObject.add_ChangeEvent (System.EventHandler`1 value)
(at LittleObject.cs line : [where the comment is])
代碼
public class ChangeEventArgs : EventArgs {
public ChangeEventArgs(SomeClass c){ someClass = c;}
public SomeClass someClass;
}
public interface IObject {
void OnChangeEvent(ChangeEventArgs e);
event EventHandler<ChangeEventArgs> ChangeEvent;
}
public class LittleObject : IObject{
public event EventHandler<ChangeEventArgs> ChangeEvent;
public fireEvent(){
OnChangeEvent(new ChangeEventArgs(new SomeClass()));
}
event EventHandler<ChangeEventArgs> IObject.ChangeEvent{
add{ // error here
lock (ChangeEvent) {
ChangeEvent += value;
}
}
remove{
lock (ChangeEvent){
ChangeEvent -= value;
}
}
}
public void OnChangeEvent(ChangeEventArgs e){
if(ChangeEvent != null) {
ChangeEvent(this, e);
}
}
}
public class Main {
IObject currentObject;
void init(){
currentObject = new IObject();
currentObject.ChangeEvent += new EventHandler<ChangeEventArgs>(OnChangeEvent);
}
void doStuff(){
currentObject.fireEvent();
}
public void OnChangeEvent(object sender, ChangeEventArgs e) {
SomeClass someClass = e.someClass;
}
}
代碼編譯?你正試圖實例化一個接口'new IObject(); ' – Chandu
加:鎖是昂貴的 - 你真的需要它嗎?通過將FireEvent方法內部的ChangeEvent賦值爲局部變量,有一種簡單的技術可以避免鎖定。 –