c# - 动态创建T时typeof(T)为null?

标签 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 | 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) 始终为空;

这是应该的方式吗?如果是这样的话,我能以某种方式以其他方式检索类型吗?

或者我做错了什么,遗漏了一些假定的东西?

问候, 米洛斯

最佳答案

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

要获取通用参数的运行时类型,这应该仍然有效:

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

关于c# - 动态创建T时typeof(T)为null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53711676/

相关文章:

c# - HTTP 错误 403.14 - 禁止访问 - 带 IIS Express 的 MVC 4

c# - ModelValidationException 是未处理的用户代码

c# - 在 IHttpModule 中访问 Form 集合会导致事件处理程序不会在默认页面上被调用

linq - ef cf linq 填充被忽略的属性

.net - 升级 .NET 应用程序数据层

c# - 使用 LINQ 和 RavenDB 对预定义过滤器进行嵌套排序

c# - 我将如何使用 System.DirectoryServices.Protocol 验证用户名/密码?

asp.net - 一键发布 : Exception in executing publishing: An item with the same key has already been added

c# - Linq Where 列表包含另一个列表中的项目

c# - Entity Framework 4 中的简单条件 LINQ 查询