2010-01-07 21 views

Trả lời

21

Thuộc tính là siêu dữ liệu. Thông thường, bạn sẽ muốn trang trí một thành viên hoặc loại với một thuộc tính để theo dõi một số thông tin về nó.

Ví dụ, DescriptionAttribute được sử dụng bởi PropertyGrid nhãn mô tả của một tài sản:

[Description("This is my property")] 
public int MyProperty { get; set; } 

Hầu hết thời gian, có nhiều hơn một mô tả sẽ không có ý nghĩa.

Tuy nhiên, có thể một thuộc tính cụ thể có ý nghĩa khi sử dụng nhiều lần. Trong trường hợp đó, bạn muốn đặt Thuộc tính để cho phép nhiều phiên bản của chính nó được gắn thẻ cho cùng một thuộc tính.

(Không phải tôi muốn làm điều này, nhưng ...) Giả sử bạn đã tạo thuộc tính tùy chỉnh để theo dõi những thay đổi lớn đối với một lớp học. Bạn có thể muốn liệt kê danh sách này cho mọi thay đổi lớn:

[Changes(Version=1.1, Change="Added Foo Feature")] 
[Changes(Version=2.0, Change="Added Bar Feature")] 
public class MyClass 
{ 
    // ... 
+6

Để xây dựng trên ví dụ Mô tả của bạn và tránh ví dụ về Thay đổi "Tôi sẽ không làm điều này", hãy xem xét thuộc tính LocalisedDescriptionAttribute, có cả ngôn ngữ và mô tả. Điều này có thể được áp dụng cho các miền địa phương khác nhau: '[LocalisedDescription (" en-NZ "," sweet as ")] [LocalisedDescription (" en-GB "," jolly good ")]'. – itowlson

+1

Tốt hơn nhiều từ sau đó trả lời của tôi :) –

+0

@ itowlson: Vâng, mặc dù, một lần nữa, tôi có thể sử dụng các tùy chọn nội địa hóa tiêu chuẩn ... Đó sẽ là một ví dụ tốt, mặc dù. –

5

Ví dụ này có thể có chút ít giả tạo nhưng hy vọng nó sẽ vượt qua được.

[Convertable(typeof(Int32)), Convertable(typeof(Double))] 
public class Test 
{ 

} 
2

Điều này phụ thuộc vào thuộc tính.

Ví dụ: bạn có thể tạo thuộc tính đánh dấu một lớp tùy thuộc vào thứ gì đó và bạn có thể cho phép nhiều phụ thuộc.

Ví dụ cụ thể, xem SuppressMessage, ngăn chặn cảnh báo phân tích mã. Một thành viên có thể có nhiều cảnh báo mà bạn có thể muốn chặn.

Ví dụ khác là WebResource; một assembly có thể chứa nhiều tài nguyên.

1

Không có ví dụ nào ở đây, tôi đã sử dụng nó trong mã sản xuất thực. Tôi đã viết một số mã để phân tích một tệp có chứa các cặp dữ liệu như (code = value). Tôi đặt một thuộc tính tùy chỉnh trên một hàm để cho biết nó nên được gọi cho một mã đã cho.

[CanParseCode("G1")] 
[CanParseCode("G2")] 
private void ParseGXCodes(string code, string value) 
{ 
    ... 
} 

Định dạng cụ thể này hơi cũ và tên miền cụ thể với hàng trăm mã khác nhau. Mục tiêu của tôi là viết một khuôn khổ để làm cho nó dễ dàng hơn để viết các bộ xử lý tập tin có thể trích xuất chỉ các mã nó cần và bỏ qua phần còn lại. Việc cho phép cùng một thuộc tính nhiều lần giúp dễ dàng thể hiện ý định của mã bằng cách đơn giản khai báo các thuộc tính trên (các) hàm xử lý từng mã.

0

Real Application World of Thuộc tính AllowMultiple = true hữu

[ManagesType(typeof(SPEC_SEC_OC), true)] 
[ManagesType(typeof(SPEC_SEC_04_OC), true)] 
public class LibSpecSelectionView : CustomView 
{ 
    public LibSpecSelectionView(SPEC_SEC_OC) 
    {} 
    public LibSpecSelectionView(SPEC_SEC_O4_OC) 
    {} 
    .... 
} 

public static class ViewManager 
{ 
    ... static Dictionary of views built via reflection 
    public void LaunchView(this CollectionBaseClass cbc) 
    { 
     ... Find class registered to handle cbc type in dictionary and call ctor 
    } 
} 

SPEC_SEC_OC myOC = DataClient.Instance.GetSPEC_SEC_OC(); 
myOC.LaunchView() 

Tôi lật AllowMultiple = true trước ngày hôm nay để cho phép các thuộc tính ManagesType sẽ được sử dụng nhiều hơn một lần. Chúng tôi có hàng trăm lớp sưu tập tùy chỉnh.Hầu hết các bộ sưu tập tùy chỉnh này có chế độ xem kế thừa từ CustomView được thiết kế để xử lý việc tạo chế độ xem giao diện người dùng cho một loại bộ sưu tập tùy chỉnh cụ thể và hiển thị nó cho người dùng. Các ManagesType thuộc tính được sử dụng thông qua sự phản ánh để xây dựng một từ điển của MỌI Xem trong ứng dụng của chúng tôi mà kế thừa từ CustomView để "đăng ký" loại đối tượng nó được thiết kế để xử lý. LibSpecSelectionView "đã phá vỡ mẫu đó" bằng cách hiển thị hai bộ sưu tập khác nhau cùng một lúc (tạo hai tab và hiển thị một bộ sưu tập tùy chỉnh trong một tab và một trong tab thứ hai) Vì vậy, chế độ xem tương tự có khả năng xử lý hai bộ sưu tập tùy chỉnh khác nhau. Từ điển trong đó chế độ xem có khả năng xử lý loại bộ sưu tập nào được tận dụng thông qua một phương pháp mở rộng để cho phép bất kỳ bộ sưu tập tùy chỉnh nào của chúng tôi khởi chạy chế độ xem đã đăng ký (hoặc chế độ xem mặc định nếu không có chế độ xem "đã đăng ký") gọi đường dây đến trình quản lý chế độ xem.

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