Вы не можете добавить атрибут, и автоматически добавляется код обработки исключений вокруг всех вызовов свойства / метода. То, что вы можете сделать, если вы создаете для этого какую-то платформу, - это посмотреть на атрибуты типа во время выполнения и реализовать свою собственную стратегию.
Например, допустим, у нас был этот атрибут:
public enum ExceptionAction { Throw, ReturnDefault };
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class ExceptionBehaviorAttribute : Attribute
{
public ExceptionBehaviorAttribute(Type exceptionType, ExceptionAction action)
{
this.exceptionType = exceptionType;
this.action = action;
}
public Type ExceptionType { get; private set; }
public ExceptionAction Action { get; private set; }
}
И скажем, мы украсили им свойство:
public interface IHasValue
{
int Value { get; }
}
public class MyClass : IHasValue
{
private string value;
public int Value
{
[ExceptionBehavior(typeof(FormatException),
ExceptionAction.ReturnDefault)]
get { return int.Parse(this.value); }
}
}
Вы можете написать определенный код, чтобы посмотреть на этот атрибут и реализовать желаемое поведение:
public int GetValue(IHasValue obj)
{
if (obj == null)
throw new ArgumentNullException("obj");
Type t = obj.GetType();
PropertyInfo pi = t.GetProperty("Value",
BindingFlags.Instance | BindingFlags.Public);
MethodInfo getMethod = pi.GetGetMethod();
var exbAttributes = (ExceptionBehaviorAttribute[])
getMethod.GetCustomAttributes(typeof(ExceptionBehaviorAttribute), false);
try
{
return obj.Value;
}
catch (Exception ex)
{
var matchAttribute = exbAttributes.FirstOrDefault(a =>
a.ExceptionType.IsAssignableFrom(ex.GetType()));
if ((matchAttribute != null) &&
(matchAttribute.Action == ExceptionAction.ReturnDefault))
{
return default(int);
}
throw;
}
}
Теперь я не говорю, что вы должны сделать это, и это не надежный код, это всего лишь пример того, как вы используете атрибуты. Здесь я пытаюсь продемонстрировать, что (большинство) атрибутов не могут / не изменяют поведение компилятора (это относится и к атрибутам MVC), но вы сможете получить то, что вы хотите если вы специально планируете это. Вы всегда должны будете использовать Отражение, как это.