【问题标题】:Runtime-Type of T in IQueryable<T>IQueryable<T> 中 T 的运行时类型
【发布时间】:2016-01-25 12:23:06
【问题描述】:

是否有可能获得 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;
}

我希望,如果我真的通过“ToList”加载列表,我会得到数据,但也不能正常工作。

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

会成功,但如果列表为空怎么办?这对我来说似乎不是一个好的解决方案?

【问题讨论】:

  • 你想要IQueryable.ElementType吗?
  • ReportDataSource.Data 是如何声明的?不能只是IQueryable&lt;T&gt;。最有可能的是,它在编译时声明为 IQueryable&lt;object&gt;,这就是为什么 object 是您所看到的类型。
  • 呃,你是对的 Dmytro,一个重载的构造函数获取了一个 IEnumerable 并将其转换为 Object。

标签: c# reflection iqueryable


【解决方案1】:

Data 的编译时类型将始终相同。根据您的描述,听起来像是IQueryable&lt;object&gt;。这就是为什么当您尝试检查类型时总是得到System.Object

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

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

【讨论】:

  • 你是对的。问题有点复杂:我们的构造函数之一是 IEnumerable 而不是 ICollection,并通过 .Cast 进行投射,这是一个不错的技巧,但不适用于反射。
【解决方案2】:

考虑查询是IQueryable&lt;T&gt;

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

为我工作

【讨论】:

  • 应该可以,这就是为什么这不能回答问题。因为很明显 dataSource.Data 不是 IQueryable.
猜你喜欢
  • 2011-04-09
  • 1970-01-01
  • 2020-12-22
  • 1970-01-01
  • 2013-09-03
  • 2012-11-15
  • 2011-04-05
  • 2011-10-09
相关资源
最近更新 更多