c# - 创建用于访问泛型类型属性的表达式树

标签 c# linq generics expression-trees

我需要编写一个泛型方法,它接受泛型类型的实例和字符串格式的属性名称,并返回一个表达式树

我需要转换一个简单的 lambda 表达式

a => a.SomePropertyName

其中 a 是泛型类型,它将具有名为 SomePropertyName 的属性

我知道我们可以使用下面的反射代码获取属性信息

System.Reflection.PropertyInfo propInfo = a.GetType().GetProperty("SomePropertyName");

这可能很简单,但我对表达式树不是很熟悉,如果有类似的问题,请链接并关闭

最佳答案

假设事先不知道参数类型和返回类型,您可能必须使用一些 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 的签名 的情况下通过以下方式获得 lambda :

var p = Expression.Parameter(a.GetType());
var expr = Expression.Lambda(Expression.PropertyOrField(p, propName), p);

关于c# - 创建用于访问泛型类型属性的表达式树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14500604/

相关文章:

c# - Windows Phone 7 Mango 的 FTP 客户端?

c# - 多个where linq

c# - 使用 linq 将 CSV 读入数组或数据表的任何方法?

c# - 如何在 Visual C# 2008 Express 中的调试/发布之间切换

c# - 将枚举值作为参数的通用 C# 方法

c# - 如果当前行宽已满,WinForm 换行

ASP.NET - 通过 SiteMapNode.ChildNodes 枚举

java - 通用 EventManager - 在 3 行代码 :-) 后卡住

C# 泛型类和 EqualityComparer

java - 有人可以阐明 Java(6) 中的协变返回类型吗?