Код: Выделить всё
Action _custom;
public event Action Custom
{
add { _custom = (Action)Delegate.Combine( _custom, value ); }
remove { _custom = (Action)Delegate.Remove( _custom, value ); }
}
При компиляции события, подобного полю, компилятор автоматически создает
хранилище для хранения делегата и создает средства доступа для события, которые
добавляют или удаляют обработчики событий в поле делегата.
Декомпилированный исходный код с использованием dotPeek для простое публичное событие Action Public; выглядит так следует:
Код: Выделить всё
private Action Public;
public event Action Public
{
add
{
Action action = this.Public;
Action comparand;
do
{
comparand = action;
action = Interlocked.CompareExchange(
ref this.Public, comparand + value, comparand);
}
while (action != comparand);
}
remove
{
Action action = this.Public;
Action comparand;
do
{
comparand = action;
action = Interlocked.CompareExchange(
ref this.Public, comparand - value, comparand);
}
while (action != comparand);
}
}
Код: Выделить всё
public static FieldInfo GetFieldInfo( this EventInfo eventInfo )
{
Contract.Requires( eventInfo != null );
return eventInfo.DeclaringType.GetField(
eventInfo.Name,
BindingFlags.DeclaredOnly | BindingFlags.Instance |
BindingFlags.Public | BindingFlags.NonPublic );
}
Невозможно создать собственные средства доступа к событиям, которые обращаются к делегату с тем же именем с помощью Visual Studio. В результате появляется сообщение: "Член с таким же именем уже объявлен". Мне интересно, можете ли вы сделать вывод, что любое событие, для которого нет резервного делегата с таким же именем, является событием с настраиваемым средства доступа.
Подробнее здесь: https://stackoverflow.com/questions/984 ... to-use-the
Мобильная версия