创建一个自定义属性来控制舍入行为
问题描述:
我有一个包含很多用于财务计算的Decimal属性的类。有些规则规定了四舍五入每个数字时要使用的小数位数。没有全球规则 - 一些是两位小数,一些0,一些8等。创建一个自定义属性来控制舍入行为
我试图找出最简单的方法来处理这个问题。我想避免让四舍五入逻辑遍布在我的代码中。我知道我可以为每个属性编写一个自定义设置器,以便在分配值时舍入值。
这看起来像我可以做一个自定义属性。但是,我之前没有写过自定义属性,而且找不到一个与我想要的东西类似的好例子,所以我可能会咆哮错误的树。
这可能吗?如果是这样,那么如何解决这个问题的一个很好的例子是什么?
如果不是,除了自定义setter外,还有其他什么方法可以考虑吗?
答
你可以用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
}
}
可以肯定一巴掌上的属性的属性,但它本身只是一段(元)数据;它不主动“做”任何事情。那么,会做什么呢? – 2009-12-01 23:38:24
好点。我想我仍然需要一个自定义setter,但也许我可以使用一个属性来控制四舍五入所使用的精度级别。 – Jason 2009-12-01 23:43:45