2011-10-31 18 views
5

Utworzono atrybut, który akceptuje tablicę (params) w swoim konstruktorze.Atrybuty i parametry tablic zgodne z CLS

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

Option tutaj jest enum (z dużą ilością wartości), więc miejsce próba połączenia będzie

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

Wszystko jest aksamitny tak daleko, a konfiguracja działa, ale mam Otrzymując "Tablice jako argumenty atrybutu nie są zgodne z CLS" ostrzeżenie na każdym wywołaniu witryny. Teraz muszę przyznać, że nie muszę używać tego zestawu z dowolnego miejsca poza C#, ani nie robię ostrzeżeń-jako-błędów, ale setki ostrzeżeń stają się denerwujące.

Oczywistym rozwiązaniem jest wyłączenie zgodności z CLS, ale w tej chwili nie mogę tego zrobić.

Czy istnieje inne podejście do tworzenia atrybutu, który będzie nadal robić to samo, ale pozbyć się ostrzeżeń?

Odpowiedz

11

dwie opcje:

1: Można dodać kilka przeciążeń zamiast:

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: jeśli Options jest enum, Mark enum jako [Flags] wyliczenia, i wywołujący je połączyć:

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

z:

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

Arg, pokonaj mnie! Ale dlaczego CLS narzeka na wewnętrzną klasę atrybutów? – leppie

+0

Tak, 'Opcja' jest wylicznikiem, a strona wywoławcza używa co najwyżej trzech lub czterech opcji, więc jest to świetne rozwiązanie. Tnx, miałem przeczucie, że przeoczyłem coś oczywistego :) – SWeko

+0

@leppie, nie narzeka na definicję atrybutu (robi to, jeśli jest publiczne), to narzeka na publiczne strony z ogłoszeniami. – SWeko

4

"Tablice jako argumenty atrybut nie jest zgodny z CLS"

dokładnie to co mówi.

Jedynym rozwiązaniem jest stworzenie wyraźnych parametrów, np:

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) 
    { 
     .... 
    } 
} 

Uwaga: Jest zabawny chociaż, że CLS jest complianed o dana klasa atrybut jest wewnętrzny. AFAIK, CLS ma być zatwierdzony tylko na możliwych członków zewnętrznych (publicznych/chronionych).

+0

Nie narzeka na definicję atrybutu (działa, gdy jest publiczny), narzeka na publiczne witryny z ogłoszeniami. – SWeko