Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当动态创建T时,typeof(T)是否为null?_C#_Entity Framework_Linq_Generics - Fatal编程技术网

C# 当动态创建T时,typeof(T)是否为null?

C# 当动态创建T时,typeof(T)是否为null?,c#,entity-framework,linq,generics,C#,Entity Framework,Linq,Generics,我需要动态创建一个类型(T),并使用参数IQueryable调用一个泛型方法。像这样: Type dynamicType = LinqRuntimeTypeBuilder.GetDynamicType(newProps); // newProps is Dictionary<string, Type> MethodInfo getData = typeof(Helpers).GetMethod("GetData", BindingFlags.Instance | BindingFla

我需要动态创建一个类型(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 }));
Type dynamicType=LinqRuntimeTypeBuilder.GetDynamicType(newProps);//新道具是字典
MethodInfo getData=typeof(Helpers).GetMethod(“getData”,BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
getData=getData.MakeGenericMethod(dynamicType);
MethodInfo exec=typeof(ObjectContext).GetMethod(“ExecuteStoreQuery”,新类型[]{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,新对象[]{“从SomeTable中选择Id”,新对象[]{});
q1=qyble.Invoke(null,新对象[]{q1});
调用(null,新对象[]{q1});
现在,在方法中:

public static object GetData<T>(IQueryable<T> data)
{
    Type t = typeof(T); // This gives me null;
}
公共静态对象GetData(IQueryable数据)
{
Type t=typeof(t);//这给了我null;
}
typeof(T)始终为空

这就是它应该是的样子吗?如果是这样的话,我能以其他方式检索打字吗

或者我做错了什么,错过了一些被假定的东西

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

要获取泛型参数的运行时类型,此操作仍然有效:

public static object GetData<T>(IQueryable<T> data)
{
    Type t = data.GetType().GenericTypeArguments[0];
    ...
}
公共静态对象GetData(IQueryable数据)
{
类型t=data.GetType().GenericTypeArguments[0];
...
}

Related:也相关:可能相关:@MilosMijatovic:由于
typeof(T)
是一个编译时运算符,可能
data.GetType().GetGenericArguments().First()
适用于
IQueryable数据
?对于
IQueryable
(实际上
IQueryable
)您可以使用
ElementType
属性。