2011-10-31 8 views
5

He creado un atributo que acepta una matriz (params) en su constructor.Atributos y parámetros de matriz CLS

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

Option aquí es una enumeración (con una gran cantidad de valores), por lo que un sitio de llamada de ejemplo será

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

Todo es color de rosa hasta ahora, y funciona de la configuración, pero estoy recibiendo una "Arrays como argumentos de atributo no es compatible con CLS" advertencia en cada sitio de llamada. Ahora, tengo que admitir que no necesito usar este ensamblaje desde ningún otro lugar que C#, ni hago advertencias como errores, pero las cientos de advertencias se vuelven molestas.

La solución obvia es desactivar el cumplimiento de CLS, pero por el momento no puedo hacer eso.

¿Hay algún otro enfoque para la creación del atributo que siga haciendo lo mismo, pero elimine las advertencias?

Respuesta

11

Dos opciones:

1: Se podría añadir algunas sobrecargas en su lugar:

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: si Options es una enumeración, marca de la enumeración como una enumeración [Flags], y tener la persona que llama que se combinan:

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

con:

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

Arg, ¡pásame! Pero ¿por qué se queja CLS en una clase de atributo interno? – leppie

+0

Sí, 'Option' es una enumeración, y el sitio de llamada utilizará como máximo tres o cuatro opciones, por lo que esta es una gran solución. Tnx, tenía la sensación de que estaba pasando por alto algo obvio :) – SWeko

+0

@leppie, no se queja de la definición del atributo (si es público), se queja en los sitios de llamadas públicas. – SWeko

4

"matrices como argumentos atributo no es compatible con CLS"

Exactamente lo que dice.

La única solución es la creación de parámetros explícitos, por ejemplo:

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: Es curioso sin embargo que CLS está siendo complianed acerca dada la clase de atributo es interno. AFAIK, CLS solo está destinado a ser validado en posibles miembros externos (público/protegido).

+0

No se queja de la definición del atributo (si es público), se queja en los sitios de llamadas públicas. – SWeko

Cuestiones relacionadas