Всякий раз, когда я вижу эти if else if
заявления, я думаю, что это должно быть сделано проще. В некоторых случаях оператор switch может помочь, но, поскольку этот вопрос уже задан, включить тип невозможно.
Итак, другой обходной путь, который я обычно использую, это какой-то Dictionary<Type, something>
. Где something
зависит от того, что я хотел бы сделать. Возможно, наилучшая подходящая конструкция для вашего случая будет выглядеть как Dictionary<Type, Func<Exception, string>>
, что может быть использовано в вашем случае как-то так:
Dictionary<Type, Func<Exception, string>> _FunctorsForType;
private void InitializeFunctorsForType()
{
_FunctorsForType = new Dictionary<Type, Func<Exception, string>>();
// Add a normal function
_FunctorsForType.Add(typeof(ArgumentException), (Func<Exception, string>)ForArgumentException);
// Add as lambda
_FunctorsForType.Add(typeof(InvalidCastException), (ex) =>
{
// ToDo: Whatever you like
return ex.Message;
});
}
private string ForArgumentException(Exception ex)
{
var argumentException = ex as ArgumentException;
if (argumentException == null)
{
throw new ArgumentException("Exception must be of type " + typeof(ArgumentException).Name);
}
// ToDo: Whatever you like
return ex.Message;
}
private void Usage(Type type)
{
Func<Exception, string> func;
if (!_FunctorsForType.TryGetValue(type, out func))
{
throw new ArgumentOutOfRangeException("Exception type " + type.Name + " is not supported.");
}
var message = func(new NullReferenceException());
// ToDo: Whatever you have to do with your message
}
Так что с этой конструкцией вам не нужно вкладывать весь свой ум в большое утверждение, если иное. Вместо этого вы можете поместить их в отдельные функции (возможно, в разные классы), чтобы лучше понять, как обрабатывать каждый тип, который вы хотите поддерживать.