【问题标题】:Getting derived type from list of parent types从父类型列表中获取派生类型
【发布时间】:2015-10-02 15:18:07
【问题描述】:

给定以下两种类类型,它们都是内置 ValidationResult 类的派生类:

class ExamValidationResult : ValidationResult
class ApplicationValidationResult : ValidationResult

我正在使用 Windows 工作流来调用最终将返回验证结果的工作流:

var validationResults = (List<ValidationResult>)workflowInvoker.Invoke(args)["Result"];

一旦调用它,它将返回一个包含先前两种对象类型的列表。 例如。 (在 Visual Studio 2013 中显示,这只是列表中的一项)

对象中底部四个属性默认为ValidationResult类,但可以看到顶部定义了派生类型。

这看起来与 ApplicationValidationResult 完全相同。 所以我的问题是我怎样才能将它们转换回它们的派生类型,而不必手动告诉它。 (我无法有效地做到这一点,因为该列表将包含两种不同的派生类型。)

【问题讨论】:

  • 你为什么要把它扔回去?
  • @SergRogovtsev 我想访问的每个类中的某些属性我无法从 ValidationResult 类型访问。调用工作流后我不想访问。
  • 但是如果你想使用一个类型的属性,你就知道你期望什么类型。这意味着您可以使用as
  • 我不能,在问题中我说过列表包含两种不同的对象类型(转换回父类型),我如何确定哪个是哪个?

标签: c# inheritance


【解决方案1】:

您可以使用typeof(yourobject)yourobject.getType() 来确定对象的运行时类型。

所以它看起来像:

foreach(var r in validationResults) {
    if(r == null) continue;
    else if(r.getType() == typeof(ExamValidationResult)) {
        //do something
    } else if(r.getType() == typeof(ApplicationValidationResult)) {
        //do something else
    } else {
        //should never happen
    }
}

【讨论】:

    【解决方案2】:

    只需尝试将每个结果转换为所需的类型:

    foreach (var result in validationResults)
    {
        var examVR = result as ExamValidationResult;
        if (examVR != null)
            //it's ExamValidationResult
        else
            //do the same check for ApplicationValidationResult
    }
    

    【讨论】:

      猜你喜欢
      • 2016-10-03
      • 1970-01-01
      • 1970-01-01
      • 2015-03-30
      • 2022-10-14
      • 2010-11-01
      • 1970-01-01
      • 2016-07-03
      • 1970-01-01
      相关资源
      最近更新 更多