2011-10-31 33 views
5

Tôi đã tạo một thuộc tính chấp nhận mảng (params) trong hàm tạo của nó.Thuộc tính tuân thủ CLS và tham số mảng

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

Option đây là một enum (với rất nhiều giá trị), do đó, một trang web gọi mẫu sẽ

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

Everything is peachy cho đến nay, và các thiết lập hoạt động, nhưng tôi nhận được "Mảng dưới dạng đối số thuộc tính không phải là cảnh báo CL2 tuân thủ" trên mỗi trang web gọi. Bây giờ, tôi phải thừa nhận rằng tôi không cần phải sử dụng lắp ráp này từ bất cứ nơi nào khác mà C#, cũng không làm tôi cảnh báo-như-lỗi, nhưng hàng trăm cảnh báo đang nhận được gây phiền nhiễu.

Giải pháp rõ ràng là tắt tính tuân thủ CLS, nhưng hiện tại tôi không thể làm điều đó.

Có cách tiếp cận nào khác để tạo thuộc tính vẫn sẽ thực hiện tương tự không, nhưng loại bỏ các cảnh báo?

Trả lời

11

Hai lựa chọn:

1: bạn có thể thêm một số quá tải thay vì:

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: nếu Options là một enum, đánh dấu enum như một enum [Flags], và có người gọi kết hợp chúng:

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

với:

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

Arg, đánh bại tôi! Nhưng tại sao CLS phàn nàn về một lớp thuộc tính nội bộ? – leppie

+0

Có, 'Tùy chọn' là một enum và trang web cuộc gọi sẽ sử dụng tối đa ba hoặc bốn tùy chọn, vì vậy đây là một giải pháp tuyệt vời. Tnx, tôi có cảm giác mình đang nhìn cái gì đó rõ ràng :) – SWeko

+0

@leppie, nó không phàn nàn về định nghĩa của thuộc tính (nó là gì nếu nó công khai), nó phàn nàn trên các trang gọi chung. – SWeko

4

"Mảng như các đối số thuộc tính là không CLS-compliant"

Chính xác những gì nó nói.

Cách giải quyết duy nhất là để tạo ra các thông số rõ ràng, ví dụ:

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

Lưu ý: Đó là hài hước dù rằng CLS đang được complianed về cho lớp thuộc tính là nội bộ. AFAIK, CLS chỉ có nghĩa là được xác thực trên các thành viên bên ngoài có thể (công cộng/được bảo vệ).

+0

Nó không phàn nàn về định nghĩa của thuộc tính (nó nếu nó được công khai), nó phàn nàn trên các trang web gọi công cộng. – SWeko

Các vấn đề liên quan