假设我有几个基本上做同样事情的类:处理字符串然后将值插入到相应的表中。基本上,它是一个SWICH ... CASE语句,如下所示。所有类之间唯一的相似之处是all都有一个“ProcessString”方法。
现在我想为所有这些方法调用添加一些错误处理。我可以尝试...捕捉所有的调用,但我想知道是否有办法以某种方式整合所有这些调用,所以我可以在交换机的末尾调用一个“ProcessString”,但这适用于其各自的类(有点像将类变量设置为类名?)。这样我就可以只对一个调用添加异常处理,并可能使用反射来调用类和方法。
switch (strKeyword)
{
case "KPI_teachers":
Teachers.processString(strLine, strKeyword, strProcessDate, strProcessHour);
break;
case "KPI_students":
Students.processString(strLine, strKeyword, strProcessDate, strProcessHour);
break;
case "KPI_classrooms":
Classrooms.processString(strLine, strKeyword, strProcessDate, strProcessHour);
break;
}
感谢任何帮助。 感谢。
答案 0 :(得分:1)
没有必要将switch
合并为一个语句来处理异常,但无论如何这都是一个很好的练习。
首先,您需要提供支持您的属性的类型(我假设它们是属性,对吗?)从类型系统的角度来看,这是一些共同点。这意味着他们需要实现相同的接口。从您的代码推断,该接口可能是
interface IStringProcessor // a bad name, but all of this is rather abstract
{
// Those parameter names are highly suspicious -- is string really the
// correct type for something called "processDate"?
void ProcessString(string line, string keyword,
string processDate, string processHour);
}
因此,如果您拥有Teachers
类型的媒体TeacherType
,则需要TeacherType
实施IStringProcessor
。其他两个也一样。
然后,您要创建一个从字符串映射到IStringProcessor
的机制。这可能是某种IDictionary
,但让我们现在保持简单,并使其成为一种方法。
private IStringProcessor GetProcessor(string name)
{
switch (name)
{
case "KPI_Teachers": return Teachers;
case "KPI_Students": return Students;
case "KPI_Classrooms": return Classrooms;
default: throw new ArgumentException("blah blah");
}
}
现在你已经掌握了所有机制来单一陈述:
// The bad naming tradition continues here -- lose the "str" prefix.
// If you forget what `keyword` is and try to do something inappropriate with it
// the compiler will be happy to chastise you.
GetProcessor(strKeyword).processString(...);
答案 1 :(得分:0)
这可能会有所不同,但是:
try
{
case "KPI_teachers":
Teachers.processString(strLine, strKeyword, strProcessDate, strProcessHour);
break;
case "KPI_students":
Students.processString(strLine, strKeyword, strProcessDate, strProcessHour);
break;
case "KPI_classrooms":
Classrooms.processString(strLine, strKeyword, strProcessDate, strProcessHour);
break;
}
catch (Exception Ex)
{}
Finally {}