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

时间:2009-12-01 23:34:16

标签: c# .net attributes rounding

我有一个具有大量Decimal属性的类,用于财务计算。有一些规则可以指定舍入每个数字时要使用的小数位数。没有全局规则 - 有些是小数点后两位,有些是0,有些是8等等。

我正试图找出解决这个问题的最简单方法。我想避免在我的代码中遍布整个逻辑。我知道我可以为每个属性编写一个自定义setter,在我赋值时对该值进行舍入。

这似乎是我可以用自定义属性做的事情。但是,我之前没有写过自定义属性,而且我找不到一个好的例子来做类似于我想要的事情,所以我可能会咆哮错误的树。

这可能吗?如果是这样,那么如何处理这个问题的好例子呢?

如果没有,除了自定义setter之外,还有其他任何我应该考虑的方法吗?

1 个答案:

答案 0 :(得分:2)

您可以使用PostSharp或其他一些基于.NET的AOP框架执行此操作。这是MethodExecutionEventArgs.ReturnValue property,表示它可以用来“修改返回值...”

这样做:

[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
    }
}