【问题标题】:typeof(T) when T is dynamically created is null? [duplicate]动态创建 T 时的 typeof(T) 为空? [复制]
【发布时间】:2018-12-10 18:36:19
【问题描述】:

我需要动态创建一个类型 (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) 始终为空;

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

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

问候, 米洛斯

【问题讨论】:

标签: c# entity-framework linq generics


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2023-03-08
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    相关资源
    最近更新 更多