2009-12-01 78 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 
    } 
}