从在 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 }) 来向它传递一组属性,但我不能让它起作用。
你会用同样的方法吗?
如何拆分传递的表达式以便获取在 NewExpression 对象中找到的每个属性的属性信息?
嗯,既然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
}
我需要更改一个函数,该函数接受一个内部包含一个 属性 的表达式,并赋予它至少使用 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 }) 来向它传递一组属性,但我不能让它起作用。
你会用同样的方法吗?
如何拆分传递的表达式以便获取在 NewExpression 对象中找到的每个属性的属性信息?
嗯,既然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
}