События могут быть вызваны только из класса, который их объявляет.
За пределами определения класса (даже в производном классе) вы можете регистрироваться и отменять регистрацию только из event
. Внутри класса компилятор позволяет только вызвать событие. Это нестандартное поведение C # (которое на самом деле немного меняется в C # 4 - Крис Барроуз описывает изменения в своем блоге ).
То, что вы хотите здесь сделать, это предоставить метод RaiseLogEvent()
в базовом классе, который позволил бы производному классу вызывать это событие.
public abstract class Base
{
public delegate void logEvent(String message, int level);
public event logEvent log;
protected void RaiseLogEvent( string msg, int level )
{
// note the idomatic use of the copy/test/invoke pattern...
logEvent evt = log;
if( evt != null )
{
evt( msg, level );
}
}
}
Кроме того, вам следует рассмотреть возможность использования типа делегата EventHandler<>
вместо создания собственных типов событий, когда это возможно.