类型成员的表达式会产生不同的表达式(MemberExpression、UnaryExpression)

2023-12-25

描述

我有一个表达式来指向我类型的属性。 但它并不适用于所有财产类型。 “不等于”的意思是 它会产生不同的表达类型。我以为这会导致MemberExpression但这种情况并非如此。

For int and Guid它导致UnaryExpression并为string in a MemberExpression.

我有点困惑 ;)

一些示例代码

My class

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

测试代码

Person p = new Person { Age = 16, Name = "John" };

Expression<Func<Person, object>> expression1 = x => x.Age;
// expression1.Body = UnaryExpression;

Expression<Func<Person, object>> expression2 = x => x.Name;
// expression2.Body = MemberExpression;

Question

我如何比较两个表达式并检查它们是否意味着 相同类型和相同属性?

更新、回答并完成示例

感谢用户达斯布林肯灯谁让我走上正轨。

他提供了方法

private static MemberExpression GetMemberExpression<T>(
    Expression<Func<T,object>> exp
) {
    var member = expr.Body as MemberExpression;
    var unary = expr.Body as UnaryExpression;
    return member ?? (unary != null ? unary.Operand as MemberExpression : null);
}

我编写了以下扩展方法来比较结果GetMemberExpression方法并检查是否GetMemberExpression().Member.Name是相同的。

private static bool IsSameMember<T>(this Expression<Func<T, object>> expr1, Expression<Func<T, object>> expr2)
{
    var result1 = GetMemberExpression(expr1);
    var result2 = GetMemberExpression(expr2);

    if (result1 == null || result2 == null)
       return false;

    return result1.Member.Name == result2.Member.Name;
}

出现这种情况的原因是Age is a value类型。为了将返回值类型的表达式强制转换为Func<Person,object>编译器需要插入一个Convert(expr, typeof(object)) http://msdn.microsoft.com/en-us/library/bb292051.aspx, a UnaryExpression http://msdn.microsoft.com/en-us/library/system.linq.expressions.unaryexpression.aspx.

For strings 和其他引用类型,但是不需要装箱,因此返回“直接”成员表达式。

如果您想前往MemberExpression在 - 的里面UnaryExpression,可以得到它的操作数:

private static MemberExpression GetMemberExpression<T>(
    Expression<Func<T,object>> exp
) {
    var member = exp.Body as MemberExpression;
    var unary = exp.Body as UnaryExpression;
    return member ?? (unary != null ? unary.Operand as MemberExpression : null);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

类型成员的表达式会产生不同的表达式(MemberExpression、UnaryExpression) 的相关文章

  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • 当 contains() 工作正常时,xpath 函数ends-with() 工作时出现问题

    我正在尝试获取具有以特定 id 结尾的属性的标签 like span 我想获取 id 以 国家 地区 结尾的跨度我尝试以下xpath span ends with id Country 但我得到以下异常 需要命名空间管理器或 XsltCon
  • 为什么#pragma optimize("", off)

    我正在审查一个 C MFC 项目 在某些文件的开头有这样一行 pragma optimize off 我知道这会关闭所有以下功能的优化 但这样做的动机通常是什么 我专门使用它来在一组特定代码中获得更好的调试信息 并在优化的情况下编译应用程序
  • 如何将图像和 POST 数据上传到 Azure 移动服务 ApiController 终结点?

    我正在尝试上传图片and POST表单数据 尽管理想情况下我希望它是json 到我的端点Azure 移动服务应用 我有ApiController method HttpPost Route api upload databaseId sea
  • 如果使用 SingleOrDefault() 并在数字列表中搜索不在列表中的数字,如何返回 null?

    使用查询正数列表时SingleOrDefault 当在列表中找不到数字时 如何返回 null 或像 1 这样的自定义值 而不是类型的默认值 在本例中为 0 你可以使用 var first theIntegers Cast
  • WPF TabControl,用C#代码更改TabItem的背景颜色

    嗨 我认为这是一个初学者的问题 我搜索了所有相关问题 但所有这些都由 xaml 回答 但是 我需要的是后台代码 我有一个 TabControl 我需要设置其项目的背景颜色 我需要在选择 取消选择和悬停时为项目设置不同的颜色 非常感谢你的帮助
  • 在 ASP.NET Core 3.1 中使用包含“System.Web.HttpContext”的旧项目

    我们有一些用 Net Framework编写的遗留项目 应该由由ASP NET Core3 1编写的API项目使用 问题是这些遗留项目正在使用 System Web HttpContext 您知道它不再存在于 net core 中 现在我们
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • C# 中的递归自定义配置

    我正在尝试创建一个遵循以下递归结构的自定义配置部分
  • 从库中捕获主线程 SynchronizationContext 或 Dispatcher

    我有一个 C 库 希望能够将工作发送 发布到 主 ui 线程 如果存在 该库可供以下人员使用 一个winforms应用程序 本机应用程序 带 UI 控制台应用程序 没有 UI 在库中 我想在初始化期间捕获一些东西 Synchronizati
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at
  • 如何在 VBA 中声明接受 XlfOper (LPXLOPER) 类型参数的函数?

    我在之前的回答里发现了问题 https stackoverflow com q 19325258 159684一种无需注册即可调用 C xll 中定义的函数的方法 我之前使用 XLW 提供的注册基础结构 并且使用 XlfOper 类型在 V
  • 在 Dynamics CRM 插件中访问电子邮件发件人地址

    我正在编写一个 Dynamics CRM 2011 插件 该插件挂钩到电子邮件实体的更新后事件 阶段 40 pipeline http msdn microsoft com en us library gg327941 aspx 并且在此阶
  • 32 位到 64 位内联汇编移植

    我有一段 C 代码 在 GNU Linux 环境下用 g 编译 它加载一个函数指针 它如何执行并不重要 使用一些内联汇编将一些参数推送到堆栈上 然后调用该函数 代码如下 unsigned long stack 1 23 33 43 save
  • Process.Start 阻塞

    我正在调用 Process Start 但它会阻止当前线程 pInfo new ProcessStartInfo C Windows notepad exe Start process mProcess new Process mProce
  • const、span 和迭代器的问题

    我尝试编写一个按索引迭代容器的迭代器 AIt and a const It两者都允许更改容器的内容 AConst it and a const Const it两者都禁止更改容器的内容 之后 我尝试写一个span
  • ASP.NET MVC 6 (ASP.NET 5) 中的 Application_PreSendRequestHeaders 和 Application_BeginRequest

    如何在 ASP NET 5 MVC6 中使用这些方法 在 MVC5 中 我在 Global asax 中使用了它 现在呢 也许是入门班 protected void Application PreSendRequestHeaders obj
  • 如何在 C++ BOOST 中像图形一样加载 TIFF 图像

    我想要加载一个 tiff 图像 带有带有浮点值的像素的 GEOTIFF 例如 boost C 中的图形 我是 C 的新手 我的目标是使用从源 A 到目标 B 的双向 Dijkstra 来获得更高的性能 Boost GIL load tiif
  • 限制C#中的并行线程数

    我正在编写一个 C 程序来生成并通过 FTP 上传 50 万个文件 我想并行处理4个文件 因为机器有4个核心 文件生成需要更长的时间 是否可以将以下 Powershell 示例转换为 C 或者是否有更好的框架 例如 C 中的 Actor 框
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我

随机推荐

  • h:selectOneMenu 与布尔项不适用于空值

    我正在使用 JSF 2 0 JBoss 7 1 1 Final 并且我在 selectOneMenu 方面遇到以下问题 我希望能够将托管 bean 中的字段设置为 true false null 因此 我创建了以下 selectOneMen
  • 无法使用python在谷歌驱动器上上传大文件

    我正在尝试使用以下代码通过 Google API 将文件上传到 Google 云端硬盘 import httplib2 from apiclient import discovery from httplib2 import Http fr
  • MongoDB 列表 - 获取每第 N 个项目

    我有一个 Mongodb 架构 大致如下 name name1 instances value 1 date ISODate 2015 03 04T00 00 00 000Z value 2 date ISODate 2015 04 01T
  • 定义一个返回结构体指针的函数

    请耐心听我说 我是其他语言的新手 也是 c 语言的新手 正在学习它http c learncodethehardway org book learn c the hard way html http c learncodethehardwa
  • 从 where 子句中给定的集合中选择表中不存在的 ID

    我有一组用户 ID 512 5 13 14 67 和一个包含以下内容的表 Id userID 1 512 2 13 3 14 4 51 5 6 该集中的一些用户 ID 并不存在于表中 例如 用户身份5和用户 ID64不存在 当我执行时Sel
  • 按位 NOT 的奇怪输出

    我试图用 0 的补码得到 1 但我得到 4294967295 这是我所做的 unsigned int x 0 unsigned int y x cout lt lt y 我的输出是 4294967295 但我期望 1 为什么会这样 顺便说一
  • 如何将扫描仪输入放入数组中......例如几个数字

    Scanner scan new Scanner System in double numbers scan nextDouble double avg 你可以尝试这样的事情 public static void main String a
  • VS 2005 C++ 项目中的 msvcr90.dll 依赖项

    我在 VS 2005 中为本机 Win32 非托管 C 创建了一个 DLL 项目 将其命名为 myProj dll 它依赖于第 3 方商业 DLL 而该 DLL 又依赖于 msvcr90 dll 我假设它是从 VS 2008 项目构建的 我
  • 如何在Excel中计算分钟和秒的平均值

    B 列中的原始数据各占一个新行 如下所示 5 04 3 57 0 58 10 01 的左边 是 的分钟和右边 是秒 我需要计算我的数据的平均值 我该怎么办 您需要转换为真实时间 一种选择是使用TIME并解析原始数据 在新列中 使用 TIME
  • 时间 - 获取昨天的日期

    我正在尝试使用 Python 获取今天和昨天的时间time模块 这对我来说适用于今天的日期 dt time strptime time strftime d m Y d m Y 但我不知道如何获得昨天的日期 我发现了很多教程datetime
  • 向空对象添加属性

    我有这个代码 var MY OBJ MY OBJ test function 我正在使用 Vscode 我得到属性测试未定义 我怎么能让这只是一个警告 定义你的对象有一个test财产 var MY OBJ test Function MY
  • 每次服务器重新启动后端口“已在使用”

    寻求有关特殊问题的帮助 每次我停止并重新启动服务器时 我都会收到以下消息 Jim Jim PC MINGW64 nodeProjects express locallibrary tutorial npm start gt email pr
  • React 标签和按钮 onClick 传播

    我想创建一个带有 render 方法的 React 组件 该方法具有 a 如果您愿意的话 可以包裹整个 盒子 的标签 单击后会重定向到另一个页面 在所述盒子内有一个 a
  • spring自动装配aop循环依赖

    我正在使用 java 配置 ComponentScan为了初始化我的bean 和 EnableAspectJAutoProxy proxyTargetClass true 使用 cglib 代理 在这个项目中 我们有很多生成的服务 它们之间
  • 服务器标记在 asp 控件内不起作用

    好吧 让这快点 我想在更改或页面加载时动态设置日历扩展器的开始和结束日期 这些值被放入 ascx 上的隐藏字段中 并在页面加载期间在 if not postback 中填充 一组日历扩展器位于网格视图的项目模板字段中 称为set A 其他的
  • 使用钢琴键盘作为电脑键盘[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 I
  • Visual Studio 2015 错误。项目的默认 XML 命名空间必须是 MSBuild XML 命名空间

    让我用 是的 我见过类似的问题 但不完全是我的情况 作为问题的开头 我的环境是 Microsoft Visual Studio Professional 2015 版本 14 0 25431 01 更新3 我的行动 我创建一个新的 C 类库
  • java.io.IOException:管道损坏

    我们目前正在将遗留应用程序迁移到 Jetty 不知怎的 我对破损的管道有一个例外 Java 6 码头8 1 8 春季3 2 0 我正在尝试将 Glassfish Web 应用程序迁移到 Jetty 在我们的测试环境中 我们使用负载平衡器 一
  • iOS7 上的 Webview 被剪裁

    我开发了一个阅读器 在使用 css 添加水平分页后 它可以在 web 视图上显示 html 文件的内容 一切工作正常 但在 iOS7 上 我注意到 web 视图在左边缘被剪裁 我已经尝试过以下方法 readingWebView frame
  • 类型成员的表达式会产生不同的表达式(MemberExpression、UnaryExpression)

    描述 我有一个表达式来指向我类型的属性 但它并不适用于所有财产类型 不等于 的意思是 它会产生不同的表达类型 我以为这会导致MemberExpression但这种情况并非如此 For int and Guid它导致UnaryExpressi