"合并"所有方法调用成一个?

时间:2014-03-13 15:05:35

标签: c# .net visual-studio-2010 .net-4.0

假设我有几个基本上做同样事情的类:处理字符串然后将值插入到相应的表中。基本上,它是一个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;
}

感谢任何帮助。 感谢。

2 个答案:

答案 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 {}