la coutume de l'attribut de classe pour les victimes de cas de l'union
-
21-12-2019 - |
Question
Avec le code ci-dessous, le Succès et l'Échec sont compilés dans 2 catégories distinctes.Comment puis-je fournir des attributs personnalisés de Réussite et d'Échec?
type Result<'TSuccess,'TFailure> =
| Success of 'TSuccess
| Failure of 'TFailure
MODIFIER
Depuis Success
et Failure
résultat dans les classes j'ai besoin de les décorer avec classe-compatible attribut AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Interface)
Puis-je obtenir que cela fonctionne?Si non, pourquoi pas?
[<ClassAttribute>]
type Result<'TSuccess,'TFailure> =
| [<ClassAttribute>] Success of 'TSuccess
| [<ClassAttribute>] Failure of 'TFailure
La solution
Les attributs peuvent être placés entre les |
et le nom de l'union de cas.
Voici un exemple simple
open System
type t = |[<Obsolete("hello")>]A
Autres conseils
Un attribut sur une union de cas sont associés à la statique New<Case>
méthode retournant la sous-classe pour le cas ou avec la Case
des biens pour une valeur de cas.Avec cette définition, F# ...
type Result<'TSuccess,'TFailure> =
| [<Obsolete>] Success of 'TSuccess
| Failure of 'TFailure
| [<Obsolete>] NotSure
L'utilisation de ce C# extrait d'invoquer la décompilation ...
var y = Result<string, string>.NewSuccess("yay");
var z = Result<string, string>.NotSure;
Aller à la définition de NewSuccess apportera le C# définition du Résultat from metadata
montrant obsolète de l'attribut.
[Obsolete]
public static Result<TSuccess, TFailure> NewSuccess(TSuccess item);
[Serializable]
[DebuggerDisplay("{__DebugDisplay(),nq}")]
public class Success : Result<TSuccess, TFailure>
{
[CompilationMapping(SourceConstructFlags.Field, 0, 0)]
[CompilerGenerated]
[DebuggerNonUserCode]
public TSuccess Item { get; }
}
Pour un cas identificateur comme NotSure ci-dessus qui n'a aucune valeur, le cas devient une propriété plutôt qu'une sous-classe et obsolète de l'attribut attaché à l'affaire est compilé dans l'air mince aussi loin que les métadonnées de la décompilation va ...
[CompilerGenerated]
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
[DebuggerNonUserCode]
public static Result<TSuccess, TFailure> NotSure { get; }
En regardant à travers ILdasm, les attributs sont là bien sur les deux ...
Method #3 (06000003)
-------------------------------------------------------
MethodName: NewSuccess (06000003)
Flags : [Public] [Static] [ReuseSlot] (00000016)
RVA : 0x00002064
ImplFlags : [IL] [Managed] (00000000)
CallCnvntn: [DEFAULT]
ReturnType: GenericInst Class Result`2< Var!0, Var!1>
1 Arguments
Argument #1: Var!0
1 Parameters
(1) ParamToken : (08000001) Name : item flags: [none] (00000000)
CustomAttribute #1 (0c000011)
-------------------------------------------------------
CustomAttribute Type: 0a00000b
CustomAttributeName: System.ObsoleteAttribute :: instance void .ctor()
Length: 4
Value : 01 00 00 00 > <
ctor args: ()
CustomAttribute #2 (0c000012)
-------------------------------------------------------
CustomAttribute Type: 0a00000c
CustomAttributeName: Microsoft.FSharp.Core.CompilationMappingAttribute :: instance void .ctor(value class Microsoft.FSharp.Core.SourceConstructFlags,int32)
Length: 12
Value : 01 00 08 00 00 00 00 00 00 00 00 00 > <
ctor args: ( <can not decode> )
Method #7 (06000007)
-------------------------------------------------------
MethodName: get_NotSure (06000007)
Flags : [Public] [Static] [ReuseSlot] (00000016)
RVA : 0x0000208c
ImplFlags : [IL] [Managed] (00000000)
CallCnvntn: [DEFAULT]
ReturnType: GenericInst Class Result`2< Var!0, Var!1>
No arguments.
CustomAttribute #1 (0c000030)
-------------------------------------------------------
CustomAttribute Type: 0a00000b
CustomAttributeName: System.ObsoleteAttribute :: instance void .ctor()
Length: 4
Value : 01 00 00 00 > <
ctor args: ()
CustomAttribute #2 (0c000031)
-------------------------------------------------------
CustomAttribute Type: 0a00000c
CustomAttributeName: Microsoft.FSharp.Core.CompilationMappingAttribute :: instance void .ctor(value class Microsoft.FSharp.Core.SourceConstructFlags,int32)
Length: 12
Value : 01 00 08 00 00 00 02 00 00 00 00 00 > <
ctor args: ( <can not decode> )