2009-12-01 76 views
0

我有一个包含很多用于财务计算的Decimal属性的类。有些规则规定了四舍五入每个数字时要使用的小数位数。没有全球规则 - 一些是两位小数,一些0,一些8等。创建一个自定义属性来控制舍入行为

我试图找出最简单的方法来处理这个问题。我想避免让四舍五入逻辑遍布在我的代码中。我知道我可以为每个属性编写一个自定义设置器,以便在分配值时舍入值。

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

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

如果不是,除了自定义setter外,还有其他什么方法可以考虑吗?

+0

可以肯定一巴掌上的属性的属性,但它本身只是一段(元)数据;它不主动“做”任何事情。那么,会做什么呢? – 2009-12-01 23:38:24

+0

好点。我想我仍然需要一个自定义setter,但也许我可以使用一个属性来控制四舍五入所使用的精度级别。 – Jason 2009-12-01 23:43:45

回答

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