2011-10-31 21 views
5

Ho creato un attributo che accetta una matrice (params) nel suo costruttore.Attributi e parametri dell'array compatibili con CLS

internal class MyTestAttribute : Attribute 
{ 
    public MyTestAttribute (params Options[] options) 
    { 
     .... 
    } 
} 

Option qui è un enum (con un sacco di valori), quindi un sito di chiamata di esempio sarà

[MyTest(Option.One, Option.Three)] 
internal void SomeMethod(int param1, long param2) 
{ 
    .... 
} 

Tutto è peachy finora, e la messa a punto funziona, ma sto ricevendo un "Gli array come argomenti degli attributi non sono conformi a CLS" su ciascun sito di chiamata. Ora, devo ammettere che non ho bisogno di usare questo assembly da qualsiasi altro C#, né faccio avvisi-come-errori, ma le centinaia di avvertimenti stanno diventando fastidiosi.

La soluzione ovvia è disattivare CLS-compliance, ma al momento non riesco a farlo.

C'è qualche altro approccio alla creazione dell'attributo che continuerà a fare la stessa cosa, ma eliminare gli avvertimenti?

risposta

11

Due opzioni:

1: Si potrebbe aggiungere alcuni sovraccarichi invece:

private MyTestAttribute(Option[] options) {...} 
public MyTestAttribute(Option option0) 
      : this(new[] {option0}) {} 
public MyTestAttribute(Option option0, Option option1) 
      : this(new[] {option0, option1}) {} 
public MyTestAttribute(Option option0, Option option1, Option option2) 
      : this(new[] {option0, option1, option2}) {} 
// add a few more, without going crazy 

2: se Options è un enum, contrassegnare l'enum come [Flags] enum, e hanno il chiamante combinarli:

[MyTest(Option.One | Option.Two)] 

con:

[Flags] 
public enum Option { 
    None = 0, 
    One = 1, 
    Two = 2, 
    Three = 4, 
    Four = 8, 
    ... 
} 
+0

Arg, picchiami! Ma perché il CLS si lamenta di una classe di attributi interna? – leppie

+0

Sì, 'Option' è un enum e il sito di chiamata utilizzerà al massimo tre o quattro opzioni, quindi questa è un'ottima soluzione. Tnx, ho avuto la sensazione che stavo trascurando qualcosa di ovvio :) – SWeko

+0

@leppie, non si lamenta della definizione dell'attributo (lo fa se è pubblico), si lamenta sui siti di chiamata pubblica. – SWeko

4

"Array come argomenti attributo non è compatibile con CLS"

Esattamente quello che dice.

L'unica soluzione è quella di creare parametri espliciti, ad esempio:

internal class MyTestAttribute : Attribute 
{ 
    public MyTestAttribute(Option o1) : this(new Option[] { o1 }) {} 
    public MyTestAttribute(Option o1, Option o2) : 
     this(new Option[] { o1, o2 }) {} 

    MyTestAttribute (Options[] options) 
    { 
     .... 
    } 
} 

Nota: E 'strano però che CLS è in fase di complianed sulla data la classe di attributo è interna. AFAIK, CLS è inteso solo per essere convalidato su possibili membri esterni (pubblico/protetto).

+0

Non si lamenta della definizione dell'attributo (lo fa se è pubblico), si lamenta sui siti di chiamata pubblica. – SWeko

Problemi correlati