如何检查 IQueryable<T>.Element 类型是不是为接口
Posted
技术标签:
【中文标题】如何检查 IQueryable<T>.Element 类型是不是为接口【英文标题】:how to check if IQueryable<T>.ElementType is Iterface如何检查 IQueryable<T>.Element 类型是否为接口 【发布时间】:2016-10-15 00:14:46 【问题描述】:我的(EF db first)类型位于接口IPolicyNumber
后面。我得到IQueryable<T>
并想检查我得到的类型是否正确(该表是否可以通过具有该接口确定的列进行搜索)。目前我正在使用typeof(IPolicyNumber).IsAssignableFrom(typeof(T))
,这有点老派,我想知道是否有办法使用类似的东西:
IQueryable<T>.ElementType is IPolicyNumber
完整方法如下:
public static IQueryable<T> ApplySearch<T>(this IQueryable<T> queryable, SearchModel search) where T : class
if (search != null && search.PolicyNumber.HasValue && typeof(IPolicyNumber).IsAssignableFrom(typeof(T)))
queryable = queryable.SearchByPolicyNumber(search);
return queryable;
public static IQueryable<IPolicyNumber> SearchByPolicyNumber<IPolicyNumber>(this IQueryable<IPolicyNumber> queryable, SearchModel search)
var policyNumberParameterLambda = Expression.Parameter((typeof(IPolicyNumber)));
var policyNumberColumnLambda = Expression.Property(policyNumberParameterLambda, "POLICY_NO");
var lambda = Expression.Lambda<Func<IPolicyNumber, bool>>(
Expression.Equal(policyNumberColumnLambda,
Expression.Convert(Expression.Constant(search.PolicyNumber), policyNumberColumnLambda.Type)
), policyNumberParameterLambda);
return queryable.Where(lambda);
【问题讨论】:
不,基本上;IQueryable<T>.ElementType is IPolicyNumber
询问 Type
对象(RuntimeTypeInfo
,最有可能)是否实现 IPolicyNumber
,它永远不会实现
@MarcGravell 嗨,马克,有没有办法IQueryable<T>.ElementType something something(IPolicyNumber)
会返回 true? :)
绝对! ***.com/questions/4963160/…
@MarcGravell 所以IQueryable<T>.ElementType
非常没用,然后检查继承不是吗?
不是真的,不;它应该可以正常工作
【参考方案1】:
使用IQueryable<T>.ElementType
时将接口与类型匹配的语法如下:
typeof(IPolicyNumber).IsAssignableFrom(queryable.ElementType)
【讨论】:
以上是关于如何检查 IQueryable<T>.Element 类型是不是为接口的主要内容,如果未能解决你的问题,请参考以下文章
如何将 IEnumerable<t> 或 IQueryable<t> 转换为 EntitySet<t>?
如何将 ODataQueryOptions<T> 应用于 IQueryable<X>
如何将 Kendo UI Grid 与 ToDataSourceResult()、IQueryable<T>、ViewModel 和 AutoMapper 一起使用?
在 WebAPI 中使用 OData 时如何将 SelectExpandQueryOption 转换为 IQueryable<T>?