c# - 将多个属性合并为一个属性

标签 c# attributes custom-attributes

是否可以将多个属性组合为一个?

假设我有这个属性 [Display][JsonProperty]

[Display(Name = "String", Description = "A string", Order = 0)]
[JsonProperty]
public string StringProperty { get; set; }

我可以创建一个新属性[DisplayAndJsonProperty],它以某种方式实现这两个属性,以便我可以像下面这样使用它吗?

[DisplayAndJsonProperty(Name = "String", Description = "A string", Order = 0)]
public string StringProperty { get; set; }

就我而言,我使用用 [JsonObject(MemberSerialization.OptIn)] 装饰的基类来控制序列化,然后我需要用 [ 装饰我想要序列化的所有属性JsonProperty]

最佳答案

通常答案是:你不能这样做。

属性只是框架的“标记”。它指示框架如何以特殊方式处理类、方法、属性、参数等。但它不会改变修饰代码的行为。

属性是框架的一部分。让我给您举一个 ASP.Net 的例子。

class SomeController : Controller {
    [HttpPost("/api/do-something")]
    public void SomeAction([FromBody] SomeData someData){
       ...
    }
}

[HttpPost][FromBody] 属性都属于 ASP.Net 框架。我们上面所做的本质上是说:

“嘿 ASP.Net,每当有人向“/api/do-something”URL 发送 POST 请求时,实例化 SomeController 类对象并调用其上的 SomeAction 方法(感谢 [HttpPost("/api/do-something")])。调用该方法时,获取请求正文中的所有内容,将其解析为 SomeData对象并将该对象传递给 SomeAction。(感谢 [FromBody])”

ASP.Net 使用反射查找所有操作并将它们映射到路由。如何?在本例中,它正在寻找具有 [HttpPost] 属性的方法。

如果您使用自己的自定义属性,它不会成为框架的一部分,因此框架不会意识到它,因此不会尊重它。

您可能可以使用一些编译后工具(例如 PostSharp ),它将用所需的属性替换您的自定义属性。但不确定是否有任何开箱即用的解决方案。

就我个人而言,我会保持简单和明确并使用原始属性。我会更容易阅读,特别是对于团队的新成员。显然它不需要编译后黑客:)

关于c# - 将多个属性合并为一个属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53303731/

相关文章:

python - 如何在Python中的语料库上使用 "collocation_list"函数?

python-3.x - 类实例上的 delattr 产生意外的 AttributeError

c# - 递归调用 - Action lambda

c# - 如何在 C# 中实现健壮的截断方法?

python - 什么是 "AttributeError: ' _io.TextIOWrapper' 对象在 python 中没有属性 'replace' "?

c# - 如何从 C# 中的子类型树获取属性的声明类型

c# - 覆盖属性 setter 和 getter

c# - 从枚举属性获取枚举

c# - 如何让 Resharper 将成员上的 "private"和类上的 "internal"显示为冗余错误?

c# - 使用任务检查互联网连接