【问题标题】:Implicit type comparison with explicit type - C#隐式类型与显式类型的比较 - C#
【发布时间】:2011-07-06 11:47:07
【问题描述】:

我有一个关于类型比较的有趣问题。我正在尝试将隐含类型与显式类型进行比较,以测试某物是否是任何类型的集合

var obField = value.GetType().InvokeMember(_stCollectionField, 
                              System.Reflection.BindingFlags.GetProperty, 
                              null, value, null);

if (obField.GetType() != typeof(IEnumerable<object>))
{
    return true;
}

在我的测试过程中,我可以确保obField 会变成对象的集合。但是,我发现它总是会在 check 和 return true 中运行,而我希望它跳过它(因为这两种类型是相等的。)

稍微调试一下就可以得到obField 的类型object {System.Collections.Generic.List&lt;System.DateTime&gt;}

如何才能匹配该类型?

谢谢

【问题讨论】:

  • 如果obFieldList&lt;DateTime&gt; 类型,它显然不是IEnumerable&lt;object&gt; 类型...你又问了什么问题?
  • List 扩展了 IEnumerable,不是吗?
  • @Andy:是的,但“==”并不意味着“可扩展自”,它意味着“等于”(同样适用于“!= ”)。由于List&lt;DateTime&gt;IEnumerable&lt;object&gt;等于,“!=”的计算结果为真。
  • 你能比较一下类型名称吗?
  • 好点,Heinzi,我没想到,谢谢。

标签: c# type-conversion implicit-typing


【解决方案1】:

使用Type.IsAssignableFrom,这里使用的是:Getting all types that implement an interface

例如:

if (typeof(IEnumerable<object>).IsAssignableFrom(obField.GetType())) { ... }

【讨论】:

  • 补充:这仅适用于 .NET 4,因为接口的协方差在早期不可用。
  • @Andy:如果您想测试任何类型的集合,那么您最好与非通用的IEnumerable 接口进行比较。
猜你喜欢
  • 1970-01-01
  • 2011-07-01
  • 1970-01-01
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-21
  • 2017-01-10
相关资源
最近更新 更多