运行时 - IQ中的T类型<t>

时间:2015-10-26 11:53:45

标签: c# reflection iqueryable

是否有可能获得IQueryable的T-Runtime类型? 如果它是正常列表,则没有问题,但如果我检查IQueryable,我总是得到一种System.Object。 我的代码目前看起来像这样:

private static Type GetDtoTypeFromDataSource(ReportDataSource dataSourceFromDb)
{
    Type result = null;
    if (dataSourceFromDb.Data.GetType().IsGenericType)
    {
        Type[] genericArguments = dataSourceFromDb.Data.GetType().GetGenericArguments();
        result = genericArguments.First();

        if (result == typeof(Object))
        {
            var obj = dataSourceFromDb.Data.Cast<object>().ToList();

            var t2 = obj.First().GetType();
            var t = obj.GetType().GetGenericArguments();
            var t3 = obj.GetType();

            result = obj.GetType();
        }
    }
    else
    {
        result = dataSourceFromDb.Data.GetType().GetElementType();
    }

    return result;
}

我希望,如果我真的通过&#34; ToList&#34;加载列表我得到了数据,但也没有工作。

var t2 = obj.First().GetType();

会不会有诀窍,但如果List是空的怎么办?这对我来说似乎不是一个好的解决方案吗?

2 个答案:

答案 0 :(得分:1)

编译时类型Data将始终相同。根据您的描述,它听起来像是IQueryable<object>。这就是您在尝试检查类型时始终获得System.Object的原因。

对于存储在此集合中的实际对象的运行时类型,您必须以与您在问题中显示的方式类似的方式检查对象:

dataSource.Data.First().GetType();

答案 1 :(得分:-1)

考虑查询是 IQueryable<T>

var typeOfT = query.GetType().GenericTypeArguments[0];

对我有用