using System;
using System.Linq.Expressions;
using System.Reflection;
namespace Sp.Common
{
public class FunctionHelper
{
/// <summary>
/// 动态构造赋值委托
/// </summary>
/// <typeparam name="TProperty">属性类型</typeparam>
/// <param name="propertyInfo">属性元数据</param>
/// <returns>强类型委托</returns>
public static Action<object, TProperty> BuildSetPropertyAction<TProperty>(PropertyInfo propertyInfo)
{
var instanceParam = Expression.Parameter(typeof(object), "instance");
var valueParam = Expression.Parameter(typeof(TProperty), "value");
//((T)instance)
var castExpression = Expression.Convert(instanceParam, propertyInfo.ReflectedType);
//((T)instance).Property
var propertyProperty = Expression.Property(castExpression, propertyInfo);
//((T)instance).Property = value
var assignExpression = Expression.Assign(propertyProperty, valueParam);
var lambdaExpression = Expression.Lambda<Action<object, TProperty>>(assignExpression, instanceParam, valueParam);
return lambdaExpression.Compile();
}
}
}