【发布时间】:2011-01-05 01:13:17
【问题描述】:
我有几个类我想用一个特定的属性来标记。我有两种方法。一种涉及使用属性扩展类。另一个使用空接口:
属性
public class FoodAttribute : Attribute { }
[Food]
public class Pizza { /* ... */ }
[Food]
public class Pancake { /* ... */ }
if (obj.IsDefined(typeof(FoodAttribute), false)) { /* ... */ }
界面
public interface IFoodTag { }
public class Pizza : IFoodTag { /* ... */ }
public class Pancake : IFoodTag { /* ... */ }
if (obj is IFoodTag) { /* ... */ }
由于使用了反射,我对使用属性犹豫不决。然而,与此同时,我对创建一个仅真正用作标签的空接口犹豫不决。我对两者都进行了压力测试,两者之间的时间差只有大约 3 毫秒,因此这里不会影响性能。
【问题讨论】:
-
只是想知道,如果一个物体是食物,你会怎么做?如果IFood接口是空的,你有什么区别呢?...
-
如果对象是 Food,我会返回 FoodEventArguments。如果对象是饮料,我会返回 DrinkEventArguments。基本上,有一个通用的基类(比如 ConcessionStandItem)被传递到函数中。
-
是的,但是在这个 FoodEventArguments 中你有一些常见的食物字段,至于 DrinkEventArguments 你应该有一些饮料常见的字段。您可以在 IFood 接口中声明此字段(属性、方法)然后:)
标签: c# attributes interface