声明 Func动态地
考虑一下:
var propertyinfo = typeof(Customer).GetProperty(sortExpressionStr);
Type orderType = propertyinfo.PropertyType;
现在我想声明
Func<int,orderType>
我知道它不可能直接发生,因为 ordertype
是在运行时,但是有任何解决方法吗?
这正是我想要做的:
var propertyinfo = typeof(T).GetProperty(sortExpressionStr);
Type orderType = propertyinfo.PropertyType;
var param = Expression.Parameter(typeof(T), "x");
var sortExpression = (Expression.Lambda<Func<T, orderType>>
(Expression.Convert(Expression.Property(param, sortExpressionStr), typeof(orderType)), param));
所有这一切都是因为我想转换:
Expression<Func<T,object>> to Expression<Func<T,orderType>>
或者如果不可能,那么我想从第一个地方用正确的类型创建它,情况如下:
我在一个方法中,该方法有一个 type(Customer)
和该类型的属性名称,我想按它进行排序,我想创建一个排序表达式树以将其传递给 Orderby
(此处) 。
Consider this:
var propertyinfo = typeof(Customer).GetProperty(sortExpressionStr);
Type orderType = propertyinfo.PropertyType;
now I want to declare
Func<int,orderType>
I know its not possible directly since ordertype
is at runtime but is there is any workaround ?
this is exactly what I want to do :
var propertyinfo = typeof(T).GetProperty(sortExpressionStr);
Type orderType = propertyinfo.PropertyType;
var param = Expression.Parameter(typeof(T), "x");
var sortExpression = (Expression.Lambda<Func<T, orderType>>
(Expression.Convert(Expression.Property(param, sortExpressionStr), typeof(orderType)), param));
all this because I want to convert:
Expression<Func<T,object>> to Expression<Func<T,orderType>>
or if its not possible then I want to create it from the first place with the right type , the case is as following:
I'm inside a method which have a type(Customer)
and a property name of that type I want to order by it , I want to create a sort expression tree to pass it to Orderby
(here).
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
您可以通过使用开放泛型类型定义来实现此目的,然后从中创建特定类型:
但是,您尝试执行的操作(调用 Lambda)并不是直接可行的。您必须调用不带类型参数的
Lambda
:这将在幕后为您创建正确的
Func<,>
。如果您想编译表达式并使用委托,则只能动态执行此操作如果您想在
Queryable
上调用OrderBy
扩展方法,事情会变得更多一点复杂的:You can do this by using an open generic type definition, and then making the specific type from that:
However, what you're trying to do (calling
Lambda<TDelegate>
) is not directly possible. You must callLambda
without a type parameter:This will create the proper
Func<,>
for you behind the scenes. If you want to compile the expression and use the delegate, you can only do this dynamically withIf you want to call the
OrderBy
extension method onQueryable
, things get a little more complicated:您可以使用 Type.MakeGenericType 方法
:应该有效:
来自此处。
You can use the Type.MakeGenericType Method:
This should work:
From here.
这解决了我的问题是我用来传递额外的参数 Typeof(Object) 和 orderby 用来告诉我它不能按对象类型排序。谢谢大家,
谢谢 dtb,我会检查你的答案是否也有效,如果有效,我会接受它,如果不行,我会接受这个。
this worked my problem was i used to pass extra parameter Typeof(Object) and orderby used to tell me it cant sort by Object type. thanks all
thanks dtb i will check if your answer work too and i will accept it if it works if not i will accept thsi one.
您想要使用 Dynamic Linq,它是 Visual Studio 示例代码的一部分。
http://weblogs.asp.net/scottgu/archive/2008/01 /07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx
You want to use Dynamic Linq, a part of the Visual Studio sample code.
http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx
看看我的解决方案是否足够动态。
综上所述,将
Product
更改为T
以使其通用并不困难。See if my solution dynamic enough.
Base on above, it's not difficult to change
Product
toT
to make it generic.您可以获取与
Func
关联的Type
,以防您想要将其传递到 创建委托。但您最终想用它做什么?可能有更直接的方法。
You can get the
Type
associated withFunc<int,orderType>
in case you wanted to e.g. pass it into CreateDelegate.But what are you ultimately wanting to do with it? There may be a more straightforward approach.