Atsortingbuts .net qui gèrent les exceptions – utilisation sur un accesseur de propriété

Je sais de mon expérience asp.net mvc que vous pouvez avoir des atsortingbuts qui gèrent les exceptions (HandleErrorAtsortingbute). Autant que je sache, la classe Controller a un événement OnException qui peut faire partie intégrante de ce comportement. Cependant, je veux faire quelque chose de similaire dans mon propre code:

exemple de rêve:

public Ssortingng MyProperty { [ExceptionBehaviour(typeof(FormatException), MyExEnum.ClearValue)] set { _thing.prop = Convert.ToThing(value); } } .... 

Le code ci-dessus n’a évidemment que très peu de sens, mais se rapproche du genre de chose que je souhaite faire. Je veux que l’atsortingbut sur l’accesseur de jeu de propriétés attrape un type d’exception et traite ensuite cela d’une manière personnalisée (ou même l’avale).

Des idées les gars?

Non, ce n’est possible que si vous utilisez PostSharp ou similaire. Ce n’est pas une fonctionnalité d’atsortingbut standard, mais ASP.NET MVC l’ ajoute pour vous. Vous ne l’obtenez pas pour tous les atsortingbuts.

Vous ne pouvez pas append d’atsortingbut et append automatiquement un code de gestion des exceptions à tous les appels d’une propriété / méthode. Ce que vous pouvez faire, si vous construisez un cadre pour cela, est d’ examiner les atsortingbuts du type au moment de l’exécution et de mettre en œuvre votre propre stratégie.

Par exemple, supposons que nous ayons cet atsortingbut:

 public enum ExceptionAction { Throw, ReturnDefault }; [AtsortingbuteUsage(AtsortingbuteTargets.Method, AllowMultiple = true)] public class ExceptionBehaviorAtsortingbute : Atsortingbute { public ExceptionBehaviorAtsortingbute(Type exceptionType, ExceptionAction action) { this.exceptionType = exceptionType; this.action = action; } public Type ExceptionType { get; private set; } public ExceptionAction Action { get; private set; } } 

Et disons que nous avons décoré une propriété avec:

 public interface IHasValue { int Value { get; } } public class MyClass : IHasValue { private ssortingng value; public int Value { [ExceptionBehavior(typeof(FormatException), ExceptionAction.ReturnDefault)] get { return int.Parse(this.value); } } } 

Vous pouvez écrire un code spécifique pour examiner cet atsortingbut et implémenter le comportement souhaité:

 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 exbAtsortingbutes = (ExceptionBehaviorAtsortingbute[]) getMethod.GetCustomAtsortingbutes(typeof(ExceptionBehaviorAtsortingbute), false); try { return obj.Value; } catch (Exception ex) { var matchAtsortingbute = exbAtsortingbutes.FirstOrDefault(a => a.ExceptionType.IsAssignableFrom(ex.GetType())); if ((matchAtsortingbute != null) && (matchAtsortingbute.Action == ExceptionAction.ReturnDefault)) { return default(int); } throw; } } 

Maintenant, je ne dis pas que vous devriez faire cela, et ce n’est pas un code infaillible, c’est juste un exemple d’ utilisation des atsortingbuts. Ce que j’essaie de démontrer ici est que (la plupart des atsortingbuts) ne peuvent pas / ne changent pas le comportement du compilateur (cela s’applique également aux atsortingbuts MVC), mais vous pourrez peut- être obtenir ce que vous voulez si vous le planifiez spécifiquement. Vous devrez toujours utiliser Reflection comme ceci.