用于标记类的接口或属性?

我有几个类,我希望用特定的属性标记。 我有两种方法。 一个涉及使用属性扩展类。 另一个使用空接口:

属性

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

由于使用了Reflection,我对使用属性犹豫不决。 然而,与此同时,我对创建一个仅用作标签的空接口犹豫不决。 我对两者进行了压力测试,两者之间的时差仅为3毫秒左右,因此这里的性能并未受到影响。

好吧,使用属性,您始终可以创建属性,使其function不会自动传播到后代类型。

使用接口,这是不可能的。

我会选择属性。

我不得不另外说。 我认为, 对于您的示例 ,标记界面更有意义。

那是因为你很可能有一天会把一些成员添加到IFood

你的设计是这样开始的:

 interface IFood {} 

但是你决定在那里添加一些东西:

 interface IFood { int Calories { get; } } 

还有其他扩展接口的方法:

 static class FoodExtensions { public static void Lighten(this IFood self) { self.Calories /= 2; } } 

您可能已经自己回答了问题。 属性在这里更合乎逻辑,reflection不是一个有红眼的大怪物=)

顺便说一句,你能显示调用代码,你确定用接口类型标记? 你不是在那里使用reflection吗?

在这种情况下,正如您所说,您没有正确使用接口。

使用reflection得到你的属性有什么问题? 通常的答案是性能,但在几乎所有情况下这通常都不是真正的问题。