显然是 where 包裹着 IQueryable 成新的 IQueryable 它所存储的变量类型 ElementType 最初的IQueryable丢失了。
where
IQueryable
ElementType
当你突破时,你可以看到这一点 where 并检查 result.ElementType 。一旦你跨过了 where 它改变了 Employee 至 Person 。
result.ElementType
Employee
Person
使用以下代码,我们恢复ElementType(用它来提供它) result.ElementType 从之前 where ):
public static IQueryable<T> ToTypedQueryable<T>(this IEnumerable<T> source, Type theType, bool exact = false) { if (source == null) throw new ArgumentNullException("source"); System.Collections.IList result = (System.Collections.IList)typeof(List<>) .MakeGenericType(theType) .GetConstructor(Type.EmptyTypes) .Invoke(null); foreach (var s in source) { Type t = s.GetType(); if (t == theType) { result.Add(s); } else if (!exact && t.IsSubclassOf(theType)) { result.Add(s); } } return (IQueryable<T>)(result.AsQueryable()); }