C# 是否有理由不将功能放在属性 class 中?

C# Is there a reason not to put functionality inside an Attribute class?

我正在编写一个标记方法的属性,以便它可以显示为单击时调用该方法的按钮。

似乎应该为该属性提供方法的 MethodInfo 我将其关闭,并且它可以在屏幕上绘制自己并在单击时调用该方法。这样 class 就很好而且独立了。

但我从未见过包含其实际功能的属性 class。它们始终只是其他 classes 使用的数据容器。

是否存在与性能相关的实际原因,为什么功能应该保留在属性 classes 之外?

不,本身没有与性能相关的原因。更重要的是,属性是一种添加额外的、声明性元数据以用于反射的方法。

不将太多功能放入属性的一个原因通常是它们只接受构造函数中的编译时常量,因此您不会获得构造函数依赖注入。这通常通过使用依赖项的方法注入来解决。

ASP.NET MVC 为他们的 AuthorizationFilterAttribute and its derived attributes. You can take a look at different attributes with "behavior" in ASP.NET's filters test website here.

做这个

没有技术原因不能将代码放在属性 类 中。但是,出于语义原因不这样做。

属性是元数据,即它们是声明性的。声明性信息说明需要什么,而不是如何实现。

另一方面,代码是程序信息;它描述了事情是如何发生的。

同样,虽然没有技术原因不能混合声明性和过程性信息,但它可以被视为不好的做法。这样做的原因是将两者混合会使代码更难阅读、更难测试和更难维护。这些不一定会发生,但与将两者分开相比,往往需要付出更多的努力来避免这些问题。

事件(例如按钮单击)是声明性的,因此您使用属性进行事件处理的想法符合声明性模型。将事件处理、程序代码放在单独的 类 中可能更明智。