如何通过反射区分集合与单个对象?

时间:2012-09-06 20:47:20

标签: c# reflection

我有这个:

var Virtual = Property.GetValue(Entity, null);

正在使用Entity Framework从存储库中提取实体。

如何确定它是单个对象还是集合?

我尝试检查类型,但不确定将其与之比较。

var VirtualType = Virtual.GetType();

使用调试器检查后,Virtual可以是实例化的DynamicProxy的{​​{1}},也可以是实例化class的{​​{1}}。如果在HashSet上使用了ICollection,则会抛出此内容:

.GetType()

我也试过这个:

DynamicProxy

适用于集合,但在单个对象上失败。

我也试过这个:

Object reference not set to an instance of an object.

但即使是收藏也是如此。

如何通过反思来辨别这两个?

3 个答案:

答案 0 :(得分:1)

检查它是否实现IEnumerable

if (Virtual is IEnumerable)
{
    // ...
}

答案 1 :(得分:1)

从查看代码中快速猜测一下。

//works for collection but throws exception for single object (as it should)
var test = (IEnumerable<object>)Virtual;

//try using
var test = Virtual as IEnumerable;
if(test == null) // single object

这与

相同
if(Virtual is IEnumerable){}

答案 2 :(得分:0)

Type.IsAssignableFrom()是一种非常有用的方法,用于确定类型支持的分配:

if (VirtualType.IsAssignableFrom(typeof(ICollection)) {
  // Do something
}