Я столкнулся со странным поведением с Microsoft Code Contracts, которое не понимаю и не знаю, как решить.
Я использую Code Contracts в своих проектах, обычно для проверки предварительных условий (значения аргумента) и вообще не было проблем с этим.Однако в этом одном классе модуль Code Contracts, кажется, автоматически вставляет проверки предварительных условий во все методы, которые принимают аргументы.
Например, это мой оригинальный код:
public override void WriteRaw(string data)
{
this.writer.WriteRaw(data);
}
Этото, что я вижу, когда декомпилирую свою сборку с помощью Reflector:
public override void WriteRaw(string data)
{
__ContractsRuntime.Requires(string.IsNullOrEmpty(data) == 0, null, "!string.IsNullOrEmpty(data)");
this.writer.WriteRaw(data);
Label_0028:
return;
}
Даже после исчерпывающего исследования и анализа моего кода, лучший диагноз, который я могу поставить, заключается в том, что это происходит только в классе, который наследует / реализуетреферат System.Xml.XmlWriter
.Во всех остальных случаях контракты будут заключаться только в том случае, если я добавлю их вручную.
В 99% случаев я бы приветствовал автоматическую проверку аргументов по контрактам кода (при условии, что я могу контролировать это).Но рассматриваемый код является записывающим XML-модулем записи, который используется XslCompilerTransform для пропуска надлежащего XHTML.И если таблица стилей XSL содержит что-то вроде <xsl:value-of select="xyz" disable-output-escaping="yes"/>
, где xyz
не существует, из-за автоматически сгенерированного контракта преобразование заканчивается ненужным исключением, которое я не могу обойти, если полностью не отключу контракты.
Есть ли у кого-нибудь опыт с этим и может указать мне правильное направление?
Спасибо, Игорь