Я не могу использовать Generics. потому что у меня есть словарь, который создает пул кодов ошибок.
Да, вы действительно можете, и это правильное решение. Вам просто нужно объявить базовый интерфейс для вашего поискового словаря.
public interface IErrorCode
{
int HttpStatus { get; }
string JsonErrorCode { get; }
void ThrowException(string pMsg);
}
public class ErrorCode<T> : IErrorCode where T : Exception
{
public int HttpStatus { get; private set; }
public string JsonErrorCode { get; private set; }
public ErrorCode(string pJsonErrorCode, int pHttpStatus)
{
this.HttpStatus = pHttpStatus;
this.JsonErrorCode = pJsonErrorCode;
}
public void ThrowException(string pMsg)
{
var exception = (T)Activator.CreateInstance
(
typeof(T),
new object[] { pMsg }
);
throw exception;
}
}
//Declare the dictionary with the interface, not the concrete type
Protocol.ErrorCodes = new Dictionary<ErrorCodeType,IErrorCode>();
Protocol.ErrorCodes.Add
(
ErrorCodeType.ElementClickIntercepted,
new ErrorCode<ElementClickInterceptedException>
(
"element click intercepted",
400
)
);
Если вам нужно работать с любым элементом в списке, вы можете использовать интерфейс - вам не нужно ничего приводить.
Чтобы получить статус HTTP:
var status = Protocol.ErrorCodes[key].HttpStatus;
Чтобы получить код ошибки Json:
var errorCode = Protocol.ErrorCodes[key].JsonErrorCode;
Обычно ваш код должен зависеть не от конкретных экземпляров, а от интерфейсов(согласно «D» в SOLID ).