创建表达式<;Func<;T、 对象>>;通过反射而变化
本文关键字:gt lt 变化 反射 表达式 Func 创建 对象 | 更新日期: 2025-01-25 10:13:27
我创建了以下类:
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
我可以将以下语句设置为方法参数:
myClass.SetFieldName<Person>(p => p.LastName);
参数类型为:
Expression<Func<Person, object>>
现在,我试图实现的是为通过反射找到的属性调用SetFieldName方法。想象一下,我有一个PropertyInfo(Person.LastName)的实例。我试图使用它的Lambda方法创建表达式,但失败了。
如果你能帮我的话,那就太好了。
谨致问候,Koray
您只需要稍微扩展一下flem的答案:
using System;
using System.Linq.Expressions;
using NUnit.Framework;
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
public static class ExpressionBuilder
{
public static Expression<Func<TClass, TProperty>> Build<TClass, TProperty>(string fieldName)
{
var param = Expression.Parameter(typeof(TClass));
var field = Expression.PropertyOrField(param, fieldName);
return Expression.Lambda<Func<TClass, TProperty>>(field, param);
}
}
[TestFixture]
public class Test
{
[Test]
public void TestExpressionBuilder()
{
var person = new Person { FirstName = "firstName", LastName = "lastName" };
var expression = ExpressionBuilder.Build<Person, string>("FirstName");
var firstName = expression.Compile()(person);
Assert.That(firstName, Is.EqualTo(person.FirstName));
}
}
// reflected field name
string fieldName = "LastName";
// create the parameter of the expression (Person)
ParameterExpression param = Expression.Parameter(typeof(Person), string.Empty);
// create the expression as a get accessor of a particular
// field of the parameter (p.LastName)
Expression field = Expression.PropertyOrField(param, fieldName);
public static class LambdaExpressionExtensions
{
public static Expression<Func<TInput, object>> ToUntypedPropertyExpression<TInput, TOutput> (this Expression<Func<TInput, TOutput>> expression)
{
var memberName = ((MemberExpression)expression.Body).Member.Name;
var param = Expression.Parameter(typeof(TInput));
var field = Expression.Property(param, memberName);
return Expression.Lambda<Func<TInput, object>>(field, param);
}
}