4

我有下面的代码。我得到一个我不知道其类型的对象。我必须检查三个 if 条件来检查它的类型,然后进行正确的转换。

有没有办法在运行时获取对象类型并进行强制转换,而不检查任何 if 条件?

我拥有的对象是requirementTemplate,我必须使用多种类型对其进行检查以获取其类型,然后进行强制转换。

if (requirementTemplate.GetType() == typeof(SRS_Requirement))
{
    ((SRS_Requirement)((TreeNodeInfo)ParentTreeNode.Tag).Handle).AssociatedFeature = ((SRS_Requirement)requirementTemplate).AssociatedFeature;
}
else if (requirementTemplate.GetType() == typeof(CRF_Requirement))
{
    ((CRF_Requirement)((TreeNodeInfo)ParentTreeNode.Tag).Handle).AssociatedFeature = customAttr.saveAttributesCustomList(AttributesCustomListCloned);
}
else if (requirementTemplate.GetType() == typeof(SAT_TestCase))
{
    ((SAT_TestCase)((TreeNodeInfo)ParentTreeNode.Tag).Handle).AssociatedFeature = ((SAT_TestCase)requirementTemplate).AssociatedFeature;
}
4

2 回答 2

3

我认为您需要使用as关键字。检查为(C# 参考)

于 2011-08-17T13:02:26.860 回答
2

这里最合适的答案是实现一个公共接口,或者从一个公共基类覆盖一个虚拟方法,并使用多态性在运行时提供实现(来自各种实现类)。然后你的方法变成:

(blah.Handle).AssociatedFeature  = requirementTemplate.GetAssociatedFeature();

如果列表不是排他的(即存在其他实现),则:

var feature = requirementTemplate as IHasAssociatedFeature;
if(feature != null) {
    (blah.Handle).AssociatedFeature = feature.GetAssociatedFeature();
}

您也可以在左侧做类似的事情,或者将其作为上下文传递:

var feature = requirementTemplate as IHasAssociatedFeature;
if(feature != null) {
     feature.SetAssociatedFeature(blah);
}

(如有必要)


另一种不常见的方法是switch在此处进行枚举:

switch(requirementTemplate.FeatureType) {
     case ...
}

这样做的一个好处是它可以是特定于类型的,也可以是特定于实例的。

于 2011-08-17T13:05:17.870 回答