c# – 动态声明Func

前端之家收集整理的这篇文章主要介绍了c# – 动态声明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>>

或者如果它不可能那么我想从正确的类型的第一个地方创建它,案例如下:

我在一个方法里面有一个类型(Customer)和一个我要通过它订购的类型的属性名称,我想创建一个排序表达式树来将它传递给Orderby(这里).

解决方法

你可以使用 Type.MakeGenericType Method
Type result = typeof(Func<,>).MakeGenericType(typeof(int),orderType);

这应该工作:

public static IQueryable<T> OrderByField<T>(
    IQueryable<T> q,string sortfield,bool ascending)
{
    var p = Expression.Parameter(typeof(T),"p");
    var x = Expression.Lambda(Expression.Property(p,sortfield),p);

    return q.Provider.CreateQuery<T>(
               Expression.Call(typeof(Queryable),ascending ? "OrderBy" : "OrderByDescending",new Type[] { q.ElementType,x.Body.Type },q.Expression,x));
}

here开始.

原文链接:/csharp/97548.html

猜你在找的C#相关文章