Доброго времени суток!
Знакомясь с контрактами, наткнулся на ситуацию, которую не знаю как разрулить. Код простой:
public static object Get(Exception ex)
{
Contract.Requires<ArgumentNullException>(ex != null);
if (!Exists(ex))
{
throw new InvalidOperationException(String.Format(MyErrorMessage, ex));
}
return ex.Data[MyKey];
}
[Pure]
public static bool Exists(Exception ex)
{
...
}
Хочу втащить Exists(ex) в контракт. Как-то так:
public static object Get(Exception ex)
{
Contract.Requires<ArgumentNullException>(ex != null);
Contract.Requires<InvalidOperationException>(Exists(ex), String.Format(MyErrorMessage, ex));
return ex.Data[MyKey];
}
Но получаю сообщение
User message to contract call can only be string literal, or a static field, or static property that is at least internally visible. А мне в данном случае хочется не просто сказать, что контракт нарушен, а еще показать для каких входных данных он нарушен. Понятно, что такая возможность будет работать только в runtime, но именно она и нужна. Можно как-нибудь побороть и использовать String.Format в сообщении?