我需要编写一个泛型方法,它以字符串格式获取泛型类型的实例和属性名称,并返回一个表达式树
我需要转换一个简单的lambda表达式
a => a.SomePropertyName
哪里 a
是泛型类型 将有一个财产 通过这个名字 SomePropertyName
我知道我们可以使用以下反射代码获取属性信息
System.Reflection.PropertyInfo propInfo = a.GetType().GetProperty("SomePropertyName");
这可能很简单,但我不熟悉Expression树,如果有类似的问题,请链接并关闭
假设事先不知道参数类型和返回类型,您可能必须使用一些 object
,但从根本上说这只是:
var p = Expression.Parameter(typeof(object));
var expr = Expression.Lambda<Func<object, object>>(
Expression.Convert(
Expression.PropertyOrField(
Expression.Convert(p, a.GetType()), propName), typeof(object)), p);
如果输入和输出类型已知,您可以调整 Func<,>
参数,也许删除 Expression.Convert
。在极端,你可以得到一个lambda 不知道的 签名 兰达,通过:
var p = Expression.Parameter(a.GetType());
var expr = Expression.Lambda(Expression.PropertyOrField(p, propName), p);
假设事先不知道参数类型和返回类型,您可能必须使用一些 object
,但从根本上说这只是:
var p = Expression.Parameter(typeof(object));
var expr = Expression.Lambda<Func<object, object>>(
Expression.Convert(
Expression.PropertyOrField(
Expression.Convert(p, a.GetType()), propName), typeof(object)), p);
如果输入和输出类型已知,您可以调整 Func<,>
参数,也许删除 Expression.Convert
。在极端,你可以得到一个lambda 不知道的 签名 兰达,通过:
var p = Expression.Parameter(a.GetType());
var expr = Expression.Lambda(Expression.PropertyOrField(p, propName), p);
你可以用这个:
var p = Expression.Parameter(a.GetType(), "x");
var body = Expression.Property(p, "SomePropertyName");
Expression.Lambda(body, p);