当动态创建T时,typeof(T)为null?

4

我需要动态创建一个类型(T),并调用一个泛型方法,其参数为IQueryable。例如:

Type dynamicType = LinqRuntimeTypeBuilder.GetDynamicType(newProps); // newProps is Dictionary<string, Type>
MethodInfo getData = typeof(Helpers).GetMethod("GetData", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
getData = getData.MakeGenericMethod(dynamicType);

MethodInfo exec = typeof(ObjectContext).GetMethod("ExecuteStoreQuery", new Type[] { typeof(string), typeof(object[]) });
exec = exec.MakeGenericMethod(dynamicType);

MethodInfo qyble = typeof(Queryable).GetMethods().Where(m => m.Name == "AsQueryable").ToList()[0];
qyble = qyble.MakeGenericMethod(dynamicType);

var q1 = exec.Invoke(db, new object[] { "SELECT Id FROM SomeTable", new object[] { } });
q1 = qyble.Invoke(null, new object[] { q1 });

getData.Invoke(null, new object[] { q1 }));

现在,在这个方法中:
public static object GetData<T>(IQueryable<T> data)
{
    Type t = typeof(T); // This gives me null;
}

typeof(T)总是null;

它是应该这样的吗?如果是这种情况,我是否可以以其他方式检索类型?

或者我做错了什么,漏掉了某些被假定的东西?

敬礼, 米洛斯


1
相关链接:https://dev59.com/f2445IYBdhLWcg3wq8Lp - user47589
4
好的,请提供需要翻译的原文。 - user47589
1
可能相关:https://dev59.com/G2TWa4cB1Zd3GeqPE5hJ#10887653 - user47589
1
@MilosMijatovic:由于typeof(T)是一个编译时运算符,也许data.GetType().GetGenericArguments().First()可以用于IQueryable<T> data - vgru
1
对于 IQueryable<T>(实际上是 IQueryable),您可以使用 ElementType 属性。 - Ivan Stoev
显示剩余2条评论
1个回答

3

由于 typeof(T) 是一个编译时运算符,因此当与动态创建的类型一起使用时,它会不幸地返回 null

为了获取泛型参数的运行时类型,这个应该仍然有效:

public static object GetData<T>(IQueryable<T> data)
{
    Type t = data.GetType().GenericTypeArguments[0];
    ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接