2011-03-01 52 views
2

支持值類型的「自動」值的最佳方式是什麼?處理需要自動值的值類型的最佳方式?

比方說,我想浮動紋理5個單位關閉屏幕的右側。我想最終開發人員設置,像這樣的值:

mytexture.Margin.Right = 5; 
mytexture.Margin.Left = int.Auto; 

在內部,我的「佈局管理器」需要知道的定位的最終結果,但堅持認爲這是一個自動的財產爲未來的比較和使用。

到目前爲止,我已經通過,處理在陽光下每一個可能的轉換,但有一個額外的字段來聲明它是否代表了一個自動設定值,或者不是一個新的值類型實現這一點。

這是正確的嗎?或者有更好的方法來處理這個問題?我的代碼目前最終結果爲:

mytexture.Margin.Right = 5; 
mytexture.Margin.Left = Size.Auto; 
+0

你可以顯示你的類型的代碼?結構可以有構造函數,所以你可以在那裏設置默認值。 – Oded 2011-03-01 12:20:58

+0

@Oded - 我就是這麼做的。我使用隱式轉換來支持各種轉換場景。 – Krisc 2011-03-07 11:57:27

回答

1

您還可以在WPF提供的GridLength類型之後建模。

他們基本上是由一個結構,具有雙重價值(除其他事項外)。他們還說隱式轉換運營商,所以很容易從代碼中使用:

RowDefinition row = new RowDefinition(); 
row.Height = 25; //Same as new GridLength(25); 
row.Height = GridLength.Auto; 

我敢肯定,他們專門檢查靜態成員,GridLength.Auto引擎蓋做工作之下。

MSDN for GridLength

+1

實際上GridLength不提供隱式(或顯式)轉換,所以你的代碼不能編譯。但是,該模式很有用,可以根據自己的類型提供。 – Tergiver 2011-03-01 15:30:00

+0

那麼,我認爲有一個類似的ASP.Net WebForms控件的寬度和高度的結構:http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.unit.aspx它實際上有我想到的隱式操作符。 – jonathanpeppers 2011-03-01 15:54:52

+0

這就是我一直在做的事情。 – Krisc 2011-03-07 11:56:48

1

這聽起來非常相似Nullable<T>,在具有術語「任何價值,而且一個標記,一個值是否設置」。你可以要麼使用Nullable<T>直接,或者如果你覺得這是類型的虐待一點點,你可以寫你自己的類似的類型,例如Defaultable<T>

+0

閱讀的問題時,我就在想歧視工會的,但可爲空值是爲C#一個更好的比賽... – Massif 2011-03-01 12:37:31

+0

有趣的解決方案,雖然我不知道缺少各種類型之間的差異(違約代表的大小和違約代表一個位置)不會成爲代碼可讀性的問題。 – Krisc 2011-03-07 11:59:00

+0

@Krisc:你總是可以創建自己的'Size'和'Position'結構。 – 2011-03-07 12:05:14