C# 接口上的自定义属性还是实现它们的类?

C# 接口上的自定义属性还是实现它们的类?,c#,interface,custom-attributes,C#,Interface,Custom Attributes,当使用自定义属性存储元数据时,最好是修饰接口,还是修饰实现接口的类,假设实现接口的任何类在属性中都有相同的数据 更新:基本上,我正在为一个项目编写一个自定义数据存储机制,对象表示存储的各种表。自定义属性用于指定数据集中用于存储该类对象的表,还用于标识n:m关系中涉及的表 因此,如果我将属性放在接口上,这是一种更清晰的方法,还是会使接口变得混乱,使访问数据本身更加麻烦?这取决于场景。例如,WCF为操作合同装饰接口 但是,如果要讨论对象(而不是接口本身),请注意,调用代码来获取接口元数据可能会很痛苦

当使用自定义属性存储元数据时,最好是修饰接口,还是修饰实现接口的类,假设实现接口的任何类在属性中都有相同的数据

更新:基本上,我正在为一个项目编写一个自定义数据存储机制,对象表示存储的各种表。自定义属性用于指定数据集中用于存储该类对象的表,还用于标识n:m关系中涉及的表


因此,如果我将属性放在接口上,这是一种更清晰的方法,还是会使接口变得混乱,使访问数据本身更加麻烦?

这取决于场景。例如,WCF为操作合同装饰接口

但是,如果要讨论对象(而不是接口本身),请注意,调用代码来获取接口元数据可能会很痛苦,特别是当类使用显式接口实现时

装饰班级会更常见,但这不是一个完全相同的问题-p

如果属性确实特定于接口(而不是实例),则对接口进行精细修饰,并讨论
typeof(IFoo)
等。但是如果您希望代码能够为属性设置每种类型的值,则必须在类级别


什么是情景?

这取决于情景。例如,WCF为操作合同装饰接口

但是,如果要讨论对象(而不是接口本身),请注意,调用代码来获取接口元数据可能会很痛苦,特别是当类使用显式接口实现时

装饰班级会更常见,但这不是一个完全相同的问题-p

如果属性确实特定于接口(而不是实例),则对接口进行精细修饰,并讨论
typeof(IFoo)
等。但是如果您希望代码能够为属性设置每种类型的值,则必须在类级别


场景是什么?

这取决于接口是否与元数据有关

interface IRunnable
{
    void Run();
}

class Test : IRunnable
{
    public void Run() { }
}
在本例中,如果属性与接口的意图相关,则将属性放在接口上是有意义的。如果属性适用于所有实现,则将属性放在接口上


但是,如果属性与类的“可运行性”(与属于
IRunnable
而非CLR的“可运行性”无关),则将属性放在类上。

这取决于接口是否与元数据有关

interface IRunnable
{
    void Run();
}

class Test : IRunnable
{
    public void Run() { }
}
在本例中,如果属性与接口的意图相关,则将属性放在接口上是有意义的。如果属性适用于所有实现,则将属性放在接口上

但是,如果属性与类的“可运行性”(与属于
IRunnable
而不是CLR的“可运行性”无关),则将属性放在类上