【问题标题】:"Consolidate" all method calls into one?将所有方法调用“合并”为一个?
【发布时间】:2014-03-13 15:05:35
【问题描述】:

假设我有几个基本上做同样事情的类:处理一个字符串,然后将值插入到相应的表中。所以本质上,它是一个 SWICH...CASE 语句,如下所示。所有类之间唯一的相似之处是都有一个“ProcessString”方法。

现在我想为所有这些方法调用添加一些错误处理。我可以try...catch所有调用,但我想知道是否有办法以某种方式整合所有这些调用,以便我可以在切换结束时调用一个“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;
}

感谢任何帮助。 谢谢。

【问题讨论】:

  • 在 23 个问题中没有一个被接受的答案。没有一个有效的答案?

标签: c# .net visual-studio-2010 .net-4.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);
}

所以如果你有一个TeacherType 类型的属性Teachers,你需要使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(...);

【讨论】:

    【解决方案2】:

    这可能还差得远,但是:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-16
      • 2014-11-22
      • 2015-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多