将多个属性合并为一个属性

时间:2018-11-14 15:35:27

标签: 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]进行序列化的所有属性

1 个答案:

答案 0 :(得分:0)

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

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

属性是框架的一部分。让我给您一个使用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方法(感谢{{1 }})。在调用方法时,获取请求主体中的所有内容,将其解析为[HttpPost("/api/do-something")]对象,然后将该对象传递给SomeData。(感谢SomeAction)“ < / p>

使用反射的ASP.Net查找所有动作并将其与路线映射。怎么样?在这种情况下,它正在寻找具有[FromBody]属性的方法。

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

您可能会使用一些编译后工具(例如PostSharp),这些工具会将您的自定义属性替换为所需的属性。不确定是否有任何现成的解决方案。

就我个人而言,我将使其简单明了并使用原始属性。特别是对于团队的新成员,我会更具可读性。显然,它不需要编译后的技巧:)