我有一种从数据库中获取数据的方法,它是通用的:
public static IQueryable<T> GetData<T>(IQueryable<T> data, some more parameters)
data 是未过滤的 db 实体集合,GetData 执行过滤、排序、跳过、处理该集合...
当我像往常一样提供 IQueryable 类型的变量(例如,T 是 Document)作为第一个参数时,它当然可以工作:
IQueryable<Document> data = ...
GetData<Document>(data, ....);
现在,我需要动态“计算”第一个参数。为此,我使用 LINQ 表达式,它将计算为 IQueryable,但我不知道在编译时是哪个 T。我在想这样的事情:
Expression db = Expression.Constant(new DataModelContainer());
Expression table = Expression.Property(db, tbl); /* tbl = "Documents", this is the whole point */
Type type = table.Type.GetGenericArguments()[0];
Expression call = Expression.Call(typeof(Queryable), "AsQueryable", new Type[] { type }, table);
object o = Expression.Lambda(call, null).Compile().DynamicInvoke();
此时 o INDEED 是 IQueryable (IQueryable),因此应该能够作为 GetData 的参数。但是,我只有对它的“对象”引用,自然不能那样使用它。
所以,我的问题是:当 o 正是这样时,有什么方法可以将 'o' 动态转换为 'IQueryable'。我知道 Actor 是编译时的事情,但我希望有人有某种解决方法。或者也许我尝试太多了。
最佳答案
您可以使用 dynamic
功能。 Dynamic 非常适合您已经必须进行反射的情况:
dynamic o = Expressin.Lambda(...
关于c# - 当编译时类型未知时,将对象动态转换为类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15044989/