Lambda 表达式未返回预期的 MemberInfo

2023-11-27

我遇到了一个我没有预料到的问题。一个例子可能比一段话更能说明我的问题:

更新:跳到最后一个代码块以获得更雄辩的代码示例。

public class A
{
  public string B { get; set; }
}

public class C : A { }

这是方法中的一些代码:

var a = typeof(C).GetMember("B")[0];
var b = typeof(A).GetMember("B")[0];

Expression<Func<C, string>> c = x => x.B;

var d = (c.Body as MemberExpression).Member;

以下是一些比较的结果:

a == b //false
a == d //false
b == d //true

前两个有点出乎意料。据我所知,即使 B 不是虚拟的,C 也可以定义与 w 同名的属性new运算符,但在本例中我没有。

第二个对我来说确实是最令人惊讶的(也是我问题的核心)。即使 lambda 的参数被明确定义为 C 类型,它仍然返回它,就像从基类访问该属性一样。

我正在寻找一种从 lambda 表达式获取 MemberInfo 的方法,就像我使用参数类型的反射来获取 MemberInfo 一样。我的项目本质上将 MemberInfos 存储在某种字典中,并且它需要具有可以通过提供 lambda 表达式来访问元素的功能。

Danny Chen 重述的代码示例

public class Base
{
    public string Name { get; set; }
}
public class Derived : Base { }

//in Main
var parentMember = typeof(Base).GetMember("Name")[0];
var childMember = typeof(Derived).GetMember("Name")[0];

Expression<Func<Base, string>> parentExp = x => x.Name;
var parentExpMember = (parentExp.Body as MemberExpression).Member;

Expression<Func<Derived, string>> childExp = x => x.Name;
var childExpMember = (childExp.Body as MemberExpression).Member;

parentMember == childMember  //false, good
parentMember == parentExpMember  //true, good
childMember == childExpMember   //false, why?

获取表达式(第一个)参数的类型,然后说

Expression<Func<C, string>> c = x => x.B; 
Type paramType = c.Parameters[0].Type;  // first parameter of expression
var d = paramType.GetMember((c.Body as MemberExpression).Member.Name)[0];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Lambda 表达式未返回预期的 MemberInfo 的相关文章

  • 如何使用 C# 中的参数将用户重定向到 paypal

    如果我有像下面这样的简单表格 我可以用它来将用户重定向到 PayPal 以完成付款
  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 更改 Android 复选框的选中和未选中图标

    我不需要图标的复选标记 而是想要一个自定义星号 我已选中和未选中的图标 这可以通过财产来完成吗 或者我必须声明一个派生自 Checkbox 的自定义小部件吗 某种混合 将其设置在布局文件中
  • 如何更改 ggplot2 中的默认主题?

    背景 我想更改 ggplot 使用的主题 但我很难理解theme update 文档和示例 我在用align plots 将箱线图放在密度图上 但我发现没有任何代码导致错误 并且留下了最小的示例 我怀疑该错误是由使用引起的theme bla
  • 如何在docker日志中记录docker healthcheck状态?

    客观的 我想通过验证 docker 日志来检查我的 docker 容器是否健康 要求 I have 两个文件 namely Dockerfile and loop sh我已经向我的泊坞窗添加了 HEALTHCHECK 如下所示 Docker
  • 如何使用 php 将事件插入用户谷歌日历?

    我有以下代码可以插入到我的特定谷歌日历中 嗯 非常成功 但是如何让用户可以添加到自己的日历 有人可以帮助我 我的预期结果就像用户可以通过谷歌登录 这意味着用户可以添加到自己的谷歌日历 谢谢 添加到我的特定日历的代码 require once
  • 为什么 C++ 标准库不提供 cmath 函数的 constexpr 版本?

    We have constexpr自 C 11 以来 函数一直在使用 并且自每个新标准 14 1z 以来 它们的限制越来越少 然而 STL 中最明显的函数可以用constexpr the cmath math h功能 还是没有constex
  • Safari/WebKit 的 console.log DOM 节点作为对象?

    这件事让我抓狂了一段时间 当我 console log 一个 DOM 节点时 通过示例返回document getElementById 它显示为交互式 html 元素 就像它出现在 元素 选项卡上一样 这肯定很方便 但有时我只想能够扩展对
  • 我如何编写正则表达式“所有字符都相同”?

    我希望它匹配 aaaaaa bb c but not aaabaaa cd 假设正则表达式引擎支持反向引用 1 在Java中它会是 theString matches 1
  • 将 Tab 键顺序限制为单个用户控件 (WPF)

    目前我有一个带有自定义 UserControl 的 WPF 项目 该控件包含一个网格 其中包含多个表单类型元素 复选框 文本框 组合框等 该控件被设计为看起来像表单一样操作 但它被放置在拖动画布内 这就是为什么它需要是 UserContro
  • 如何“缓存” mongoDB/Mongoose 结果以在 Express.js 视图和路由中使用

    我想要实现的是某种方式缓存结果 of a mongoDB 猫鼬我可以在我的视图和路线中使用的查询 每当将新文档添加到集合中时 我都需要能够更新此缓存 由于函数是异步的 我不确定这是否可能 如果是 那么如何做到这一点 这是我目前用于存储画廊的
  • 外部链接到 Shiny App 中的特定 tabPanel

    可以相对轻松地在平面闪亮应用程序中使用锚链接 https stackoverflow com a 28605517 1659890 但是 外部链接是否可以针对特定的目标 tabPanel of a navbarPage在闪亮的应用程序中 考
  • Windows Phone 7 Mango 照片相机的取景器方向

    我将 PhotoCamera 控件与 Windows Phone 7 Mango Beta 2 开发工具结合使用 相机控件的 ViewFinder 是一个填充有 VideoBrush 的矩形对象 如下例所示 http msdn micros
  • Python Pandas 使用杰卡德相似度的距离矩阵

    我已经实现了一个使用杰卡德相似度构造距离矩阵的函数 import pandas as pd entries id 1 category1 100 category2 0 category3 100 id 2 category1 100 ca
  • 计算每行零的数量,并删除具有超过 n 个零的行

    我有一个关于计算每行零的问题 我有一个像这样的数据框 a c 1 2 3 4 5 6 0 2 5 b c 0 0 0 2 6 7 0 0 0 c c 0 5 2 7 3 1 0 3 0 d c 1 2 6 3 8 4 0 4 0 e c 0
  • 我迷路了。 ASP.NET MVC 5 发生了什么?

    我一直在埋头从事各种项目 显然微软一直在忙着做出一些重大改变 这让我很困惑 当我去年安装 Visual Studio 2017 并去创建一个新项目时 ASP NET Core 第一次出现在我的视野中 突然我可以选择 NET Framewor
  • flutter 中的闪屏实现

    我是 Flutter 新手 我想在我的应用程序中添加启动画面 我使用了 initState 和导航器 但这没有用 该应用程序打开时会出现初始屏幕 但之后它不会导航到下一个屏幕 我的 main dart import package flut
  • Java:学习基础网络的最佳起点 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我正在尝试用Java 编写一个简单的网络聊天程序 我几乎没有网络经验 我想知道我应该开始寻找哪些资源 当然除了这里 目前最好坚持使用核心 Java
  • 将文件上传到 S3 时选项请求被拒绝

    当我尝试将 JS 文件上传到 S3 时 出现上传错误 OptionsRequestDenied 除了这个之外 所有其他文件 包括 JS 文件 都可以工作 该文件使用 jQuery 发出一些跨域请求 如下所示 function corsReq
  • NodeJS Electron 与 Express

    我正在尝试使用 Electron 用于网站和桌面应用程序 和 Express 用于会话等 制作一个网络应用程序 现在 我将其作为我的 app js const express require express const app Browse
  • 使用不同的 sqlite 数据库结构将新版本更新到应用程序商店

    我已经在应用程序商店上传了一个应用程序 版本1 0 我的应用程序使用 sqlite 数据库来存储一些数据 现在 我对数据库进行了一些更改 我在数据库的一个表中添加了 2 或 3 个新列 我想用新版本 1 1 更新我的应用程序的先前版本 它具
  • Lambda 表达式未返回预期的 MemberInfo

    我遇到了一个我没有预料到的问题 一个例子可能比一段话更能说明我的问题 更新 跳到最后一个代码块以获得更雄辩的代码示例 public class A public string B get set public class C A 这是方法中