Tôi có một vài lớp mà tôi muốn gắn thẻ với một thuộc tính cụ thể. Tôi có hai cách tiếp cận trong tâm trí. Một liên quan đến việc sử dụng một lớp mở rộng thuộc tính. Người kia sử dụng một giao diện trống:Giao diện hoặc thuộc tính để gắn thẻ các lớp học?
Thuộc tính
public class FoodAttribute : Attribute { }
[Food]
public class Pizza { /* ... */ }
[Food]
public class Pancake { /* ... */ }
if (obj.IsDefined(typeof(FoodAttribute), false)) { /* ... */ }
Interface
public interface IFoodTag { }
public class Pizza : IFoodTag { /* ... */ }
public class Pancake : IFoodTag { /* ... */ }
if (obj is IFoodTag) { /* ... */ }
Tôi ngập ngừng sử dụng các thuộc tính do sử dụng của Reflection. Đồng thời, tuy nhiên, tôi do dự về việc tạo ra một giao diện trống mà chỉ thực sự phục vụ như một thẻ. Tôi đã thử nghiệm căng thẳng cả hai và chênh lệch thời gian giữa hai chỉ khoảng ba phần nghìn giây, do đó hiệu suất không bị đe dọa ở đây.
chỉ tự hỏi, bạn sẽ làm gì nếu một vật thể là thức ăn? nếu giao diện IFood trống, bạn phân biệt chúng là gì? ... – serhio
Nếu đối tượng là Thực phẩm, tôi sẽ trả về FoodEventArguments. Nếu đối tượng là, nói, Đồ uống, tôi sẽ trả lại DrinkEventArguments. Về cơ bản, có một lớp cơ sở chung (giả sử ConcessionStandItem) được truyền vào hàm. – Scott
Xem thêm: http://blogs.msdn.com/ericlippert/archive/2009/02/02/properties-vs-attributes.aspx –