おそらく、C# で最も不可解なのは、Exception クラスのメッセージ プロパティが読み取り専用であることです。この理由がわからないせいか、Exception から派生した妥当な例外クラスを作成しようとすると、イライラします。
たとえば (そして実際に私がやろうとしていること)、OPC サーバーに接続しようとしたときに発生させる例外を作成したいと考えています。試行が失敗すると OPCException 型のオブジェクトが発生しますが、ユーザーに詳細情報を提供したいと考えています。そこで、OPCCaException という名前のクラスを用意しました。このクラスは、元の例外からの戻りコード、サーバー名、およびホスト名の 3 つの引数を取ります。
public class OPCCaException : Exception
{
    public OPCCaException(ReturnCode returnCode, string serverName, string nodeName)
    {
        if (nodeName == "")
        {
            this.Message = "Failed to connect to OPC server "+ serverName + 
                           ": " + TranslateReturnCode()";
        }
        else
        {
            this.Message = "Failed to connect to OPC server "+ serverName + 
                           " on node " + nodeName +
                           ": " + TranslateReturnCode()";
        }
    }
}
これは完全に合理的なことのように思えますが、Message プロパティが読み取り専用であるため、コンパイルできません。メッセージを設定する唯一の方法は、基本クラスのコンストラクターに渡すことです。派生クラスのコンストラクターで設定できないのはなぜですか? 引数に対してあらゆる種類の処理を行うために私が考えることができる唯一の方法は、メッセージを構築するための静的クラスを作成することです。
public class OPCCaException : Exception
{
    private static string BuildMessage(<some arguments>)
    {
        string message = "some message";
        return message;
    }
    public OPCCaException(ReturnCode returnCode, string serverName, string nodeName) :
        base(BuildMessage(returnCode, serverName, nodeName))
    {
    }
 }
それがコンパイルされるかどうかはわかりません。
これを行う標準的な方法は何ですか?