C# 为实现接口的所有类强制添加属性

C# 为实现接口的所有类强制添加属性,c#,interface,attributes,enforcement,C#,Interface,Attributes,Enforcement,假设我的程序中所有组件都有最简单的接口 public interface IComponent { } 我知道为项目编写的每个组件都必须实现这个接口,而且我知道所有这些组件都将使用C#的BinaryFormatter保存到磁盘上。这意味着每个组件都必须使用[Serializable]属性进行修饰。现在有没有办法强制添加此属性 我说“现在”是因为我能找到各种各样的问题,告诉我这是不可能的——但我能找到的所有问题都是2008年的。从那以后,C#规范中有什么变化吗?或者

假设我的程序中所有组件都有最简单的接口

public interface IComponent
{               
}
我知道为项目编写的每个组件都必须实现这个接口,而且我知道所有这些组件都将使用C#的
BinaryFormatter
保存到磁盘上。这意味着每个组件都必须使用
[Serializable]
属性进行修饰。现在有没有办法强制添加此属性


我说“现在”是因为我能找到各种各样的问题,告诉我这是不可能的——但我能找到的所有问题都是2008年的。从那以后,C#规范中有什么变化吗?或者我必须使用旧答案中描述的解决方法之一吗?

您可以编写单元测试,使用反射从库中提取
IComponent
的所有实现,并检查它们是否具有
可序列化属性。我不相信自2008年以来.NET中引入了任何新的东西可以使该检查特定于编译时,对不起。

我能找到的关于堆栈溢出的最古老的C#问题是从2008年7月开始的。你是如何找到2008年之前问题的答案的?Lots在C#规范中已经改变了,但是没有任何东西会改变属性在编译时的使用方式(也就是说,它们大部分都不是…只有少数例外,编译器知道)。你应该把你的问题作为你找到的一个现有答案的副本来结束,或者干脆把它全部删除。“或更早”的部分是误导性的,因为它是从2008年开始的。如果你的评论真的是答案,我将结束这个问题:没有任何变化,也没有办法强制属性修饰。但我认为问这个问题是明智的,因为自C#3.0和6.0以来,很多事情都发生了变化。