2011-01-31 12 views
15

E 'valida (cioè compilato ed eseguito.) Per mettere un attributo sul parametro generico per una classe o di un metodo:Che uso hanno gli attributi sui parametri generici?

public class MyClass<[My] T> 
{ 
    private void MyMethod<[My] T>() 
    {} 
} 

public class MyAttribute : Attribute 
{} 

Non ho mai visto questo era, e sto lottando per venire con una ragione per cui vorresti.

È solo una stranezza/effetto collaterale delle specifiche del linguaggio o esiste un motivo valido/utile per inserire un attributo in questa posizione?

+6

Questi sono generici _parametri_, non vincoli. – SLaks

+4

Non sapevo che fosse possibile applicare attributi a parametri generici. Cool :) –

+0

Non l'ho mai visto, è molto interessante, grazie! Ora se posso effettivamente trovare un uso ... EDIT: puoi usare gli attributi sui parametri per qualsiasi tipo di metodo - non solo generico. Mi sta venendo in mente. – RichK

risposta

13

Per la stessa ragione, gli attributi sono utili su qualsiasi costrutto; forniscono metadati che possono essere usati da Reflection o da altri post-processori per fare varie cose. Ad esempio, potresti avere un sistema AOP che utilizza un attributo su un argomento di tipo per applicare determinati vincoli di runtime che altrimenti non potrebbero essere espressi. Non sono sicuro che ci siano sistemi che effettivamente usano questi attributi per fare qualcosa, ma non c'è motivo di non accettarli come metadati.

+0

Avevo pensato al caso di riflessione poiché utilizzo lo stesso approccio per marcare le classi in un'applicazione, ma ho comunque faticato a pensare a uno scenario per questa particolare caratteristica. – adrianbanks

+3

adrianbanks: la risposta di Dan è accurata. Ad esempio, una volta ho scritto uno strumento che elabora un parametro generico con [DelegateConstraint] o con [EnumConstraint] per modificare il loro vincolo su Delegato o Enum, per superare la limitazione di C#. –

+0

@Jb Evain: ho fatto la stessa cosa prima! LOL. –

1

Sono sicuro che alcuni dado AOP troveranno un motivo valido per decorare i parametri generici con gli attributi. Di certo non riesco a pensare a nessuno. Prova questo:

typeof(MyClass<>).GetGenericArguments().GetCustomAttributes().OfType<MyAttribute>(); 

Se questo Enumerable ha tutti gli elementi, allora è possibile accedere l'attributo è stato posizionato sul parametro generico della classe. In caso contrario, non è possibile e quindi disporre di dati che ci si aspetta di accedere da qualsiasi altra classe nella base di codice è inutile. TUTTAVIA, possono ancora avere il codice che viene eseguito quando è istanziato e vengono istanziati dal runtime quando la classe generica entra in ambito, consentendo di eseguire la logica orientata all'aspetto nell'attributo stesso. Esattamente quello che sarebbe, e come sarebbe diverso da decorare direttamente la classe o il metodo generico, è lasciato come esercizio alle persone che adorano AOP molto più di me.

Problemi correlati