为什么有些对象属性是 UnaryExpression,而另一些对象属性是 MemberExpression?
根据我的 的答案采取行动使用 lambda 而不是字符串属性名称选择模型属性 问题,想要将属性添加到集合中,如下所示:
var props = new ExportPropertyInfoCollection<JobCard>();
props.Include(model => model.BusinessInstallNumber).Title("Install No").Width(64).KeepZeroPadding(true);
props.Include(model => model.DeviceName).Title("Device").Width(70);
props.Include(model => model.DateRequested).Title("Request Date").Format("{0:dd/MM/yyyy}").Width(83);
我在 Include
方法中编写了以下代码:
public class PropertyCollection<T>
{
public void Include(Expression<Func<T, object>> expression)
{
var memberExpression = expression.Body as MemberExpression;
if (memberExpression != null)
{
var pes = new ExportPropertyInfoBuilder {Property = new ExportPropertyInfo {Property = memberExpression.Member as PropertyInfo}};
Properties.Add(pes.Property.Property.Name, pes.Property);
return pes;
}
但是,在运行时在代码中,我发现一些 lambda 产生了预期的 MemberExpression 值,但其他 lambda 产生了 UnaryExpression 值。在使用 lambda 添加所有属性之前,我必须将第一行代码更改为以下内容:
var memberExpression = expression.Body as MemberExpression ?? ((UnaryExpression) expression.Body).Operand as MemberExpression;
POCO 业务对象中的所有属性都是“简单”类型,即 string、DateTime、int、bool 等。它们用几个不同的 DataAnnotations 属性进行装饰。
是什么导致我的示例中的某些 lambda 产生 MemberExpression 值和其他 UnaryExpression 值?在我的示例中,第一个 UnaryExpression 位于第三行,即 DateTime 属性,但布尔属性也会生成 UnaryExpressions。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我想我知道问题是什么。您的表达式返回类型
object
。如果将其更改为
Expression>
,则应正确推断返回类型,并且UnaryExpression
(我假设是某种装箱操作)应该不会发生。更新:
Include
的签名应为:I think I know what the problem is. Your expression returns type
object
.If you change this to
Expression<Func<T, R>>
the return type should be correctly inferred, andUnaryExpression
(which I will assume is some boxing operation) should not occur.Update:
The signature for
Include
should be: