是否可以将多个属性组合为一个?
假设我有这个属性 [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/