C# 在这里使用代理是否合适?
我有三种可能的输入类型,分别是人名、公司名或地址 忽略我的占位符和自定义方法,以下是其中两个:C# 在这里使用代理是否合适?,c#,validation,webforms,delegates,C#,Validation,Webforms,Delegates,我有三种可能的输入类型,分别是人名、公司名或地址 忽略我的占位符和自定义方法,以下是其中两个: protected void nameSearch_Click(object sender, EventArgs e) { if (offRadio.Checked == false && comRadio.Checked == false) { errorAlert("Please sp
protected void nameSearch_Click(object sender, EventArgs e)
{
if (offRadio.Checked == false && comRadio.Checked == false)
{
errorAlert("Please specify the search type");
}
else
{
strValidator(nameBox.Text);// This is the function I need to change.
//In it's current condition, it will only validate against
// general properties, however to do more in depth
// validation, the validation method needs to be dependant
// on the type of input
if (nameBox.Text != string.Empty)
{
if (offRadio.Checked == true)
//This is an input of the person name category
{
logic.createQuery(fnms(nameBox.Text),
"personName", lnms(nameBox.Text));
}
else if (comRadio.Checked == true)
//And this is of the Company name category
{
logic.createQuery(nameBox.Text, "companyName");
}
}
else
{
errorAlert("Please enter a search parameter");
}
}
}
这里的目的是分析来自nameBox.Text
的输入,并根据反注射协议对其进行检查。理想情况下,我希望使用一种方法来实现这一点,并且该方法根据输入是来自人名(offRadio.Checked=true
)还是公司名(comRadio.Checked=true
)而有所不同。我可以有两种方法(甚至一种,基于条件),但这会导致nameSearch\u Click()
成为嵌套语句的相对泥潭,我希望避免这种情况
根据我的一些研究,实现这一点的方法是使用委托无效,但是我不知道如何实现这一点。我的验证方法是否为委托?或者我必须创建一个新的委托方法,并将我的Click
事件的内容移动到其中
此外,如何添加逻辑以确定输入类别?创建验证委托是一种可接受的方法:
delegate void Validate(string text);
protected void nameSearch_Click(object sender, EventArgs e)
{
Validate validate;
if (offRadio.Checked)
validate = PersonNameValidator;
else if (comRadio.Checked)
validate = CompanyNameValidator;
else
validate = GeneralValidator;
validate(nameBox.Text);
... More code, blah blah ...
}
private void PersonNameValidator(string text)
{
// Validate person name
}
private void CompanyNameValidator(string text)
{
// Validate company name
}
private void GeneralValidator(string text)
{
// Validate general properties
}
通常,我希望
Validate
委托返回类型bool
,以便在失败时返回false
,或在成功时返回true
。这样一来,验证方法实际上仅限于处理验证。调用函数将负责处理失败/成功。为什么委托
?您不能使用一些参数(单选按钮的值或基于其值的enum
值)调用一些验证类的方法吗?例如,Validator.CheckUrl(textBoxUrl.Text,Validator.Mode.TrimSpaces)
@Sinatr这个想法是为了让代码尽可能小,但是你可能是对的,你的建议可能是我的。。。“最安全”选项。请显示大代码,我们将看到。使用代理在这里没有任何价值。与其分配委托,不如调用该方法;它在功能上是相同的。@Servy你可能是对的。但是,我个人认为意图更清楚,特别是如果if/else链不仅仅是分配validate变量。它将验证调用放在一个地方,而不是分散在多行if/else混乱中。它还清楚地显示和保证验证方法具有相同的签名。您不能让一个验证器返回bool,而另一个验证器返回其他内容。@Servy在本例中,我认为我在这里同意它的ME86,尽管我对委托有了更多的了解,并且实现方式略有不同。