[英]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.