Если я вас правильно понял, вам просто нужно переслать поля как publi c properties:
public class FatalException: Exception
{
private readonly DSMException _exception = new DSMException();
/* ... snip ... */
public string MyType => _exception.Type;
public string MyMessage => _exception.Message;
public string MyInnerExceptionMessage => _exception.InnerExceptionMessage;
}
Однако, похоже, это немного нарушает цель класса DSMException
. Вы могли бы сделать DSMException
свойством publi c, но я настоятельно рекомендую заранее сделать его неизменяемым.
Я, очевидно, не знаю предполагаемого назначения DSMException
, однако, поскольку все значения в любом случае собираются в конструкторах, вы также можете напрямую присвоить publi c свойства:
public FatalException(string? Message): base(Message)
{
Type = "FATAL";
Message = "MESSAGE:" + Message;
}
public string MyType { get ; }
public string MyMessage { get ; }
public string MyInnerExceptionMessage { get ; }
Продолжая предложение неизменяемости: вы можете определить свой класс DSMException
следующим образом:
public sealed class DSMException
{
public DSMException(string type, string message, string innerMessage)
{
Type = type;
Message = message;
InnerExceptionMessage = innerMessage;
}
public string Type { get; }
public string Message { get; }
public string InnerExceptionMessage { get; }
}
... а затем просто сделать его свойством publi c:
public class FatalException: Exception
{
/* ... snip ... */
public DSMException DSM => _exception;
}
Похоже, что вам все равно придется дублировать большую часть кода конструктора в FatalException
, ErrorException
, WarningException
et c.
Также обратите внимание, что пока ваши пользовательские исключения только летают в том же AppDomain, все нормально; в тот момент, когда они могут пересекать границы домена (например, по проводам), DSMException
должен быть сериализуемым, а также должны быть реализованы методы сериализации ваших пользовательских исключений.