【问题标题】:Get object type in runtime在运行时获取对象类型
【发布时间】:2011-08-17 13:00:16
【问题描述】:

我有下面的代码。我得到一个我不知道其类型的对象。我必须检查 三个 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;
}

【问题讨论】:

  • 为什么用 3 个不同的 C# 版本标记?是哪一个?
  • 如果您将((TreeNodeInfo)ParentTreeNode.Tag).Handle 提取到一个单独的变量中开始,您的代码会更加清晰。您还应该考虑使用is 而不是调用GetType()

标签: c# dynamic-typing


【解决方案1】:

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

【讨论】:

  • 这在技术上是正确的答案,尽管它没有解决代码墙所暗示的令人震惊的糟糕设计。
  • 我看不出这对他的设计有何帮助。他仍然需要对类型进行硬编码才能访问 AssociatedFeature 属性。因此,仍然需要所有 if 语句,这是他想要减少的......其他答案(接口)更合适
  • 我会说这是“有没有办法在运行时获取对象类型并进行强制转换,而不检查任何 if 条件?”的答案? :D
【解决方案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 ...
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多