从在 Expression 对象中找到的多个 属性 个对象获取 PropertyInfo

Get PropertyInfo from multiple property objects found in an Expression object

我需要更改一个函数,该函数接受一个内部包含一个 属性 的表达式,并赋予它至少使用 2 个属性的能力。

我有以下基础 class,其中包含嵌套的 ElementHelper class

public class DomainObjectViewModel<TModel> where TModel : DomainObject
{

    public class ElementHelper
    {
        public static void Create<T1>(TModel model, Expression<Func<TModel, T1>> expression)
        {
            var getPropertyInfo = GetPropertyInfo(expression);
            //Do cool stuff
        }
        private static PropertyInfo GetPropertyInfo<T1>(Expression<Func<TModel, T1>> propertyExpression)
        {
            return (PropertyInfo)((MemberExpression)propertyExpression.Body).Member;
        }
    }
}

-ElementHelper class 包含一个 Create 函数,该函数获取表达式的 属性 信息,并且仅当您在表达式中传递一个 属性 时才有效。

然后我继承了下面的class,它在构造函数中使用了辅助函数。

public class ProductViewModel : DomainObjectViewModel<ProductEditViewModel>
{
    public ProductViewModel(ProductEditViewModel model)
    {
        //It works for one property in the Expression
        ElementHelper.Create(model, x => x.LaunchDate);
        //Give the ability to pass multiple paramenters in the expression  
        ElementHelper.Create(model, x => new { x.LaunchDate, x.ApplyLaunchDateChanges });
    }
}

我想我可以使用 NewExpression (new { x.LaunchDate, x.ApplyLaunchDateChanges }) 来向它传递一组属性,但我不能让它起作用。

嗯,既然ElementHelper.GetPropertyInfo是你自己的方法,你可以决定什么是允许通过的,然后在那个方法中适当地处理它。

目前你只处理 MemberExpression,所以这就是为什么它只适用于单个 属性 访问器。如果你想能够通过new { ... },你需要像这样添加对NewExpression的支持:

private static IEnumerable<PropertyInfo> GetPropertyInfo<T1>(Expression<Func<TModel, T1>> propertyExpression)
{
    var memberExpression = propertyExpression.Body as MemberExpression;
    if (memberExpression != null)
        return Enumerable.Repeat((PropertyInfo)memberExpression.Member, 1);
    var newExpression = propertyExpression.Body as NewExpression;
    if (newExpression != null)
        return newExpression.Arguments.Select(item => (PropertyInfo)((MemberExpression)item).Member);
    return Enumerable.Empty<PropertyInfo>(); // or throw exception
}