我有以下代码。我得到一个我不知道的类型的对象。我得检查一下 三,如果条件检查其类型,则进行正确的演员。
有没有办法在运行时获取对象类型,并进行强制转换, 没有检查任何条件?
我拥有的对象是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;
}
答案 0 :(得分:3)
我认为您需要使用 as
关键字。
选中(C# Reference)
答案 1 :(得分: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 ...
}
关于这一点的一个好处是它可以是特定于类型的,也可以是特定于实例的。