Как изменить поведение метода в отличном использовании тот метод в метаклассе

Использование операторов не имеет ничего общего с исключениями. Использование блоков просто гарантирует, что Dispose вызывается для объекта в блоке using, когда он выходит из этого блока. И.Е .:

using(SqlConnection conn = new SqlConnection(conStr))
{
   //use conn
}//Dispose is called here on conn.

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

5
задан Cœur 17 February 2019 в 13:08
поделиться

2 ответа

Отличный идиоматический способ - сохранить ссылку на старый метод и вызвать ее внутри нового.

def oldPlus = Integer.metaClass.getMetaMethod("plus", [Integer] as Class[])

Integer.metaClass.plus = { Integer n ->
    return oldPlus.invoke(oldPlus.invoke(delegate, n), 1)        
}

assert 5 == 2 + 2

На самом деле это не так хорошо задокументировано, и я планировал разместить в блоге сообщение именно на эту тему сегодня вечером или завтра :).

7
ответ дан 14 December 2019 в 04:46
поделиться

Используйте это, чтобы "испортить" метод plus:

Integer.metaClass.plus {Integer n -> delegate - (-n) - (-1)}
assert 2+2 == 5

Неудивительно, что использование оператора '+' в методе перегрузки plus приведет к StackOverflow, необходимо использовать что-то другое, кроме '+' оператор.

Другой механизм: используйте XOR или магию битовых операторов.

С уважением, Мирный огонь

1
ответ дан 14 December 2019 в 04:46
поделиться
Другие вопросы по тегам:

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