2011-06-07 19 views
11

Câu hỏi đơn giản, làm thế nào để bạn buộc trình biên dịch C# để ném một lỗi biên dịch.Làm thế nào để ném một lỗi trình biên dịch nếu nhiều hơn một thành viên có cùng một thuộc tính


Cập nhật: Có lẽ tốt hơn nên sử dụng số Assert.Fail() thay thế?

Tôi có thuộc tính tùy chỉnh chỉ nên áp dụng cho ONE thành viên của một lớp học. Bên trong phương thức tĩnh của lớp khác, nó trông cho rằng một thành viên và tôi muốn nó thất bại (không ném một ngoại lệ) nếu có nhiều hơn một thành viên có thuộc tính được áp dụng cho nó.

public class Foo 
{ 
    [MyCustomAttribute] 
    public String FooString { get; set; } 

    [MyCustomAttribute] 
    public String OtherFooString { get; set; } 
} 


public class Bar<T> 
    where T : class, new() 
{ 
    static Bar() 
    { 
     //If more than one member of type Foo has MyCustomAttribute 
     //applied to it compile error or Assert.Fail()? 
    } 
} 
+4

Tại sao bạn muốn làm điều này? – goalie7960

+0

Assert.Fail() không ném một lỗi trình biên dịch, nó ném một khẳng định tại thời gian chạy – Matt

+0

@Matt: Tôi biết, tôi đã tự hỏi điều gì sẽ tốt hơn .... một lỗi biên dịch hoặc lỗi xác nhận. –

Trả lời

26

Bạn có thể sử dụng một chỉ thị chẩn đoán:

#error Oops. This is an error. 

hoặc chỉ là một cảnh báo:

#warning This is just a warning. 

Bạn muốn bình thường muốn đưa những trong khối có điều kiện, tôi mong đợi ...

EDIT: OK, bây giờ bạn đã cập nhật câu hỏi của mình, bạn chỉ đơn giản là không thể thực hiện việc này lúc biên dịch. Đề xuất của bạn về việc sử dụng Assert.Fail sẽ chuyển vấn đề thành thời gian thực hiện.

tôi sẽ đề nghị bạn viết bài kiểm tra đơn vị để phát hiện này (lặp trên tất cả các loại trong lắp ráp và kiểm tra xem các thuộc tính chỉ được áp dụng tối đa một lần mỗi loại).

EDIT: Trong năm 2016 ... khi phân tích mã theo đề xuất của OP không thực sự là lỗi trình biên dịch, giờ đây Visual Studio sử dụng Roslyn, có thể móc vào trình biên dịch và thực sự gặp lỗi từ trình biên dịch, sử dụng trình phân tích mã Roslyn. Tuy nhiên, tôi sẽ vẫn thích cá nhân đơn vị xét nghiệm cho điều này, như sau đó các mã có thể được xây dựng và thử nghiệm bởi ai, bất kể họ đã phân tích Roslyn cài đặt. Vẫn không có cách nào để xác thực điều này bằng trình biên dịch C# thuần túy.

+1

Đúng. Tôi có một điều kiện nghiêm ngặt cho việc này. Mặc dù, tôi tự hỏi ... là tốt hơn để làm điều này hoặc một Assert.Fail()? Phần mà tôi muốn phát hiện lỗi nằm trong một hàm tạo tĩnh. –

+1

Tôi để lại một bình luận ở trên quá, bạn không thể sử dụng Assert.Fail() vì điều đó sẽ không ném một lỗi trình biên dịch, nó ném một khẳng định tại thời gian chạy. – Matt

+0

@myermian: Không phải 'Assert.Fail' cũng không' # error' làm những gì bạn muốn. Thay vào đó hãy sử dụng kiểm tra đơn vị. –

2

Trả lời đơn giản: Yêu cầu biên dịch cú pháp không hợp lệ.

1

Tôi không tin rằng điều này có thể được thực hiện, bởi vì nó không thể nói với trình biên dịch để kiểm tra lỗi tùy chỉnh. Tất nhiên, bạn có thể sử dụng #error, như Jon đã nói, nhưng không có cách nào để tự thêm điều kiện. Bởi vì #error sẽ gây ra lỗi mỗi lần.

Điều duy nhất bạn có thể chắc chắn là kiểm tra thời gian chạy và sau đó ném ngoại lệ.

Chỉnh sửa: Chết tiệt, đặt câu hỏi sau khi được chỉnh sửa nhiều.

+0

Eh, xin lỗi về điều đó. Sau khi tôi đăng câu hỏi, tôi nhận ra rằng có lẽ tôi nên cung cấp thêm thông tin như một loại "... và tôi có nên làm điều đó theo cách đặc biệt không?" thêm vào. Và đó là một điều tốt tôi đã làm vì Jon nói đúng, Bài kiểm tra đơn vị là điều sẽ giúp giữ cho mọi thứ phù hợp trong tình huống này. –

3

Hơn một năm sau khi câu hỏi này được hỏi, tôi đã nhận ra một giải pháp thay thế cho các bài kiểm tra đơn vị: Phân tích mã.

Nếu không có quy tắc phân tích Mã tồn tại, bạn có thể thậm chí roll your own. Chỉ cần đảm bảo đặt quy tắc là Lỗi thay vì Cảnh báo (hoặc đảm bảo xử lý cảnh báo dưới dạng lỗi).Dưới đây là một hình ảnh của màn hình:

Code Analysis Error

Tất nhiên, tôi vẫn ưa thích sử dụng một thử nghiệm đơn vị trong trường hợp đặc biệt này, nhưng tôi chắc chắn có thể nhìn thấy Mã Phân tích như một giải pháp thay thế, đặc biệt là cho những thứ như tùy chỉnh đặt tên (ví dụ: Tất cả các lớp của tôi phải kết thúc bằng 'Foo' hoặc ném một lỗi).

+1

Có thể cho các quy tắc Phân tích Mã tùy chỉnh được đưa vào dự án hoặc giải pháp sao cho khi một nhà phát triển khác làm việc trên cùng một dự án/giải pháp từ máy trạm của họ, họ cũng sẽ không phải thiết lập quy tắc theo cách thủ công? – crush

+0

@crush, bạn đã bao giờ tìm ra liệu có thể nhúng các quy tắc vào một dự án không? –

+1

@JonathanWilson: Tôi có thể nói với bạn rằng bây giờ chúng tôi có Roslyn, có thể bao gồm .NET Analyzers trong các dự án như các gói NuGet. –

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