Создайте пустые обработчики событий C# автоматически

try
{
   // do your insert
}
catch(Exception ex)
{
   if (ex.GetBaseException().GetType() == typeof(SqlException))
   {
       Int32 ErrorCode = ((SqlException)ex.InnerException).Number;
       switch(ErrorCode)
       {
          case 2627:  // Unique constraint error
              break;
          case 547:   // Constraint check violation
              break;
          case 2601:  // Duplicated key row error
              break;
          default:
              break;
        }
    }
    else
    {
       // handle normal exception
    }
}
68
задан Tomas Andrle 4 December 2008 в 13:41
поделиться

6 ответов

Я видел это на другом сообщении и бесстыдно украл его и использовал его в большой части моего кода с тех пор:

public delegate void MyClickHandler(object sender, string myValue);
public event MyClickHandler Click = delegate {}; // add empty delegate!

//Let you do this:
public void DoSomething() {
    Click(this, "foo");
}

//Instead of this:
public void DoSomething() {
    if (Click != null) // Unnecessary!
        Click(this, "foo");
}

<забастовка> *, Если кто-либо знает источник этой техники, отправьте его в комментариях. Я действительно верю в источник, получая подлежащий выплате кредит.

( Редактирование: я получил его из этого сообщения Скрытые Функции C#? )

145
ответ дан Community 7 November 2019 в 10:01
поделиться

Можно записать, как:

MyEvent += delegate { };

я не уверен, что Вы хотите сделать, исправить.

6
ответ дан leppie 7 November 2019 в 10:01
поделиться

Нотация:

if ( MyEvent != null ) {
  MyEvent( param1, param2 );
}

не ориентировано на многопотоковое исполнение. Необходимо сделать это этот путь:

EventHandler handler = this.MyEvent;
if ( null != handler ) { handler( param1, param2 ); }

я понимаю, что это - беспокойство, таким образом, можно сделать вспомогательный метод:

static void RaiseEvent( EventHandler handler, object sender, EventArgs e ) {
    if ( null != handler ) { handler( sender, e ); }
}

и затем звоните:

RaiseEvent( MyEvent, param1, param2 );

при использовании C# 3.0 можно объявить вспомогательный метод как дополнительный метод:

static void Raise( this EventHandler handler, object sender, EventArgs e ) {
    if ( null != handler ) { handler( sender, e ); }
}

и затем звоните:

MyEvent.Raise( param1, param2 );

Также можно создать следующее расширение/вспомогательные методы для других обработчиков событий. Например:

static void Raise<TEventArgs>( this EventHandler<TEventArgs> handler,
    object sender, TEventArgs e ) where TEventArgs : EventArgs
{
    if ( null != handler ) { handler( sender, e ); }
}
58
ответ дан nawfal 7 November 2019 в 10:01
поделиться

Это - плохая идея в этом код, который использует событие, теперь имеет ожидание, что объект с событием был кодирован с действием по умолчанию. Если Ваш код никогда не будет используемым больше нигде никем больше тогда, что я предполагаю, что можно выйти сухим из воды.

2
ответ дан Dinah 7 November 2019 в 10:01
поделиться

Вам не нужны несколько дополнительных методов для различных обработчиков событий, Вам просто нужен тот:

public static class EventHandlerExtensions {
  public static void Raise<T>(this EventHandler<T> handler, object sender, T args) where T : EventArgs {
    if (handler != null) handler(sender, args);
  }
}
5
ответ дан vkelman 24 November 2019 в 14:01
поделиться

Вы можете использовать PostSharp, чтобы во время сборки добавить это волшебство. Это лучший способ.

-1
ответ дан 24 November 2019 в 14:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: