繁体   English   中英

创建自定义属性以控制舍入行为

[英]creating a custom attribute to control rounding behavior

我有一类具有很多用于财务计算的十进制属性的类。 有一些规则指定四舍五入每个数字时要使用的小数位数。 没有全局规则-有些是两位小数,有些是0,有些是8,等等。

我正在尝试找出解决此问题的最简单方法。 我想避免四舍五入逻辑遍布我的代码。 我知道我可以为每个属性编写一个自定义设置器,以便在分配值时将其取整。

这似乎是我可以使用自定义属性执行的操作。 但是,我之前没有编写过自定义属性,也找不到很好的示例来完成与我想要的操作类似的操作,因此我可能在错误的树上吠叫。

这可能吗? 如果是这样,那么如何解决这个问题的一个好例子是什么?

如果没有,除了自定义设置器之外,我还应该考虑其他方法吗?

您可以使用PostSharp或其他基于.NET的AOP框架来实现。 这是MethodExecutionEventArgs.ReturnValue属性 ,该属性表示可以用来“修改返回值...”

可以做到这一点:

[Serializable]
public class RoundingAttribute : OnMethodBoundaryAspect
{
    public override void OnExit(MethodExecutionEventArgs eventArgs)
    {
        base.OnExit(eventArgs);
        eventArgs.ReturnValue = Math.Round((double)eventArgs.ReturnValue, 2);
    }
}

class MyClass
{
    public double NotRounded { get; set; }

    public double Rounded { [Rounding] get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        var c = new MyClass
                {
                    Rounded = 1.99999, 
                    NotRounded = 1.99999
                };

        Console.WriteLine("Rounded = {0}", c.Rounded); // Writes 2
        Console.WriteLine("Not Rounded = {0}", c.NotRounded);  // Writes 1.99999
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM