我有一个具有大量Decimal属性的类,用于财务计算。有一些规则可以指定舍入每个数字时要使用的小数位数。没有全局规则 - 有些是小数点后两位,有些是0,有些是8等等。
我正试图找出解决这个问题的最简单方法。我想避免在我的代码中遍布整个逻辑。我知道我可以为每个属性编写一个自定义setter,在我赋值时对该值进行舍入。
这似乎是我可以用自定义属性做的事情。但是,我之前没有写过自定义属性,而且我找不到一个好的例子来做类似于我想要的事情,所以我可能会咆哮错误的树。
这可能吗?如果是这样,那么如何处理这个问题的好例子呢?
如果没有,除了自定义setter之外,还有其他任何我应该考虑的方法吗?
答案 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
}
}