C# 如何使用自定义属性覆盖属性设置器?

C# 如何使用自定义属性覆盖属性设置器?,c#,C#,前 基本上,我不希望数量设置为小于零。传统的方法是 [NoZero()] public int Quantity{ get; set; } protectedint\u数量; 公共整数 { 设置 { 如果(_quantity\u Quantity;set{if(value


基本上,我不希望数量设置为小于零。

传统的方法是

[NoZero()]
public int Quantity{ get; set; }
protectedint\u数量;
公共整数
{
设置
{
如果(_quantity<0)抛出新ArgumentOutOfRangeException(“某些消息”);
_数量=价值;
}
收到
{
退货数量;
}
}
除非在设置属性之前编写检查属性的代码,否则无法真正使用属性。例如,这就是工作原理。在文档中,请注意以下内容:

为了实现上述要求,我们需要在UI层编写代码,以适应/验证上述标准


因此,您必须编写大量复杂的代码,并且注意不要直接设置属性。这就是大多数人不使用属性的原因。

这并不是直接回答你的问题,而是提供一个有趣的选择

如果您使用的是一个IoC框架,并且该框架具有“拦截”的可能性,那么您可以强制拦截您的属性访问(只要该类通过IoC非课程进入)

我自己还没有尝试过财产访问,但理论上它可以工作


或者,直接使用代码编织库:这可以有效地将自身编织到IL中。

属性本身不起任何作用,它们只是声明一些东西。您可以创建任何属性并根据需要调用它,例如
[NonNegative]
,也可以使用现有的DataAnnoations属性。但是,您需要在某个地方处理验证逻辑。您可以对属性做什么-您可以提供setter,它将验证
,并对无效值抛出异常。这取决于您的要求以及如何\由谁分配属性。您需要更多上下文。属性属性的任何使用者都知道吗?为什么不指定一个setter,在存储之前检查该值?您所要求的是验证,而不是覆盖。数据注释属性用于指定验证程序类可用于确保对象满足所有验证规则的验证规则。它们不会覆盖setter为什么不使用简单的条件实现setter<代码>专用整数_数量;公共int数量{get=>\u Quantity;set{if(value<0)throw new Exception();\u Quantity=value;}范围检查已由数据注释属性提供。每个.NET堆栈(Winforms、WPF、ASP.NET)都可以识别数据注释A。在中,它们可用于生成服务器端和客户端验证代码。我想每个人都知道如何用这种方式重写setter。我需要的是一种通过自定义属性截取值的方法。@yeldar在属性方面有很好的观点。
protected int _quantity;

public int Quantity
{
    set
    {
        if (_quantity < 0) throw new ArgumentOutOfRangeException("Some message");
        _quantity = value;
    }
    get
    {
        return _quantity;
    }
}