開發一個Windows應用程式,肯定少不了控制項的輸入驗證,而增加輸入驗證的方法不計其數,這裡介紹一種使用Sophus的攔截功能來為你的 TextBox 控制項很乾淨地增加輸入驗證的方法。“很乾淨”這裡指的意思是可以透明的增加和刪除輸入驗證而不用考慮任何使用者邏輯代碼。
現在我們有一個 TextBox 名為 textBox1 ,還有一個Button 叫 button1
這個button1有一個click事件,代碼如下
private void button1_Click(object sender, System.EventArgs e)
{
MessageBox.Show("The number is \"" + textBox1.Text + "\"");
}
如果我們要給 textBox1 控制項增加一個輸入驗證,而不改動 button1 的代碼要怎麼辦?
我們可以看一下 textBox1.Text這個屬性,這個是一個virtual的屬性,就意味著可以被攔截,好了,大致的解決辦法出來了,我們是用 Sophus提供的 IInterceptor介面實現一個攔截器介面代碼如下
public class NumberValidationInterceptor : IInterceptor
{
public object Intercept(IInvocation invocation, params object[] args)
{
string retString = invocation.Proceed(args) as string;
if(Regex.IsMatch(retString, @"^[+-]?\d*[.]?\d*$"))
{
return retString;
}
else
{
MessageBox.Show("Please input a number.","Validation Failure",MessageBoxButtons.OK, MessageBoxIcon.Warning);
return "0";
}
}
}
這個攔截器具體要攔截什麼,接下來我們定義一個Contract,裡面就包含了攔截的具體對象和方法等詳細資料,代碼如下: EmitProxyContract contract = new EmitProxyContract();
contract.Target(typeof(TextBox));
contract.Intercept(typeof(NumberValidationInterceptor), "get_Text");
然後呢就是建立這個動態代理的的類型 EmitProxy proxy = (new EmitProxyFactory()).GetProxy(contract);
proxy.Independent = true;
這裡我們使用了 Independent = true 的意思就是可以將這個動態代理的配置與其他使用同樣contract的動態代理配置獨立出來,從而可以使用Sophus的一些進階功能,如下面這種textBox1 = proxy.Wrap(this.textBox1) as TextBox;
這句話就是使用由Sophus封裝的textBox1類型動態替換掉原有的textBox1,而 textBox1的instance並沒有變,大家可以看表單上的控制項就可以知道,但是上邊的button1在click的時候就會被動態hook住了,這就是Sophus的神奇之處。
看,當textBox1中輸入的不是數字時,動態攔截器就生效了。
從這裡下載Sophus免費版本: http://research.grapecity.com.cn/cs/files/7/sophus/default.aspx
Sophus論壇: http://research.grapecity.com.cn/cs/forums/14/ShowForum.aspx