.net 以编程方式在文本框上调用验证

.net 以编程方式在文本框上调用验证,.net,winforms,validation,invoke,.net,Winforms,Validation,Invoke,我正在编写单元测试,以测试GUI中键入的数据是否得到验证和正确记录。目前我使用的代码如下: using (MyControl target = new MyControl()) { PrivateObject accessor = new PrivateObject(target); TextBox inputTextBox = (TextBox)accessor.GetField("InputTextBox"); string expected, actual;

我正在编写单元测试,以测试GUI中键入的数据是否得到验证和正确记录。目前我使用的代码如下:

using (MyControl target = new MyControl())
{
    PrivateObject accessor = new PrivateObject(target);
    TextBox inputTextBox = (TextBox)accessor.GetField("InputTextBox");
    string expected, actual;

    expected = "Valid input text.";
    inputTextBox.Text = expected;
    // InputTextBox.TextChanged sets FieldData.Input
    actual = target.FieldData.Input;
    Assert.AreEqual(expected, actual);
}
但我宁愿使用已验证事件而不是TextChanged事件

using (MyControl target = new MyControl())
{
    PrivateObject accessor = new PrivateObject(target);
    TextBox inputTextBox = (TextBox)accessor.GetField("InputTextBox");
    string expected, actual;
    bool valid;

    expected = "Valid input text.";
    inputTextBox.Text = expected;
    valid = inputTextBox.Validate();
    // InputTextBox.Validating returns e.Cancel = true/false
    // InputTextBox.Validated sets FieldData.Input
    Assert.IsTrue(valid);
    actual = target.FieldData.Input;
    Assert.AreEqual(expected, actual);
}

如何对文本框或支持已验证事件的任何其他控件调用验证?我应该写什么来代替
inputTextBox.Validate()
?我对C#和VB.Net很熟悉。

我不确定这里是否遗漏了什么,但这种扩展方法似乎很有效:

private static readonly MethodInfo onValidating = typeof(Control).GetMethod("OnValidating", BindingFlags.Instance | BindingFlags.NonPublic);
private static readonly MethodInfo onValidated  = typeof(Control).GetMethod("OnValidated" , BindingFlags.Instance | BindingFlags.NonPublic);
public static bool Validate(this Control control)
{
    CancelEventArgs e = new CancelEventArgs();
    onValidating.Invoke(control, new object[] { e });
    if (e.Cancel) return false;
    onValidated.Invoke(control, new object[] { EventArgs.Empty });
    return true;
}
并被称为:

valid = inputTextBox.Validate();