有没有办法在动态/扩展中执行链接空检查?

2023-12-12

C# 有有用的空条件运算符。很好地解释了这个答案 too.

我想知道当我的对象是动态/扩展对象时是否可以进行类似的检查。让我向您展示一些代码:

给定这个类的层次结构

public class ClsLevel1
{
    public ClsLevel2 ClsLevel2 { get; set; }
    public ClsLevel1()
    {
        this.ClsLevel2 = new ClsLevel2(); // You can comment this line to test
    }        
}

public class ClsLevel2
{
    public ClsLevel3 ClsLevel3 { get; set; }
    public ClsLevel2()
    {
        this.ClsLevel3 = new ClsLevel3();
    }       
}

public class ClsLevel3
{
    // No child
    public ClsLevel3()
    {
    }
}

如果我执行这种链接空检查,它会起作用

ClsLevel1 levelRoot = new ClsLevel1();
if (levelRoot?.ClsLevel2?.ClsLevel3 != null)
{
     // will enter here if you DO NOT comment the content of the ClsLevel1 constructor
}
else
{
     // will enter here if you COMMENT the content of the ClsLevel1 
}

现在,我将尝试用动态(ExpandoObject)重现这种行为

dynamic dinRoot = new ExpandoObject();
dynamic DinLevel1 = new ExpandoObject();
dynamic DinLevel2 = new ExpandoObject();
dynamic DinLevel3 = new ExpandoObject();

dinRoot.DinLevel1 = DinLevel1;
dinRoot.DinLevel1.DinLevel2 = DinLevel2;
//dinRoot.DinLevel1.DinLevel2.DinLevel3 = DinLevel3; // You can comment this line to test

if (dinRoot?.DinLevel1?.DinLevel2?.DinLevel3 != null)
{
     // Obviously it will raise an exception because the DinLevel3 does not exists, it is commented right now.
}

有没有办法用动力学模拟这种行为?我的意思是,检查一长串成员中是否存在空值?


如果您想以更自然的方式支持这一点,您可以继承 DynamicObject 并提供自定义实现:

class MyExpando : DynamicObject
    {
        private readonly Dictionary<string, object> _dictionary = new Dictionary<string, object>();

        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            var name = binder.Name.ToLower();
            result = _dictionary.ContainsKey(name) ? _dictionary[name] : null;
            return true;
        }

        public override bool TrySetMember(SetMemberBinder binder, object value)
        {
            _dictionary[binder.Name.ToLower()] = value;
            return true;
        }
    }

Testing:

 private static void Main(string[] args)
        {
            dynamic foo = new MyExpando();
            if (foo.Boo?.Lol ?? true)
            {
                Console.WriteLine("It works!");
            }
            Console.ReadLine();
        }

输出将是“它有效!”。由于 Boo 不存在,我们得到一个空引用,以便空条件运算符可以工作。

我们在这里所做的是返回一个null参考输出参数尝试获取会员每次没有找到属性时,我们总是返回 true。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有办法在动态/扩展中执行链接空检查? 的相关文章

  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template

随机推荐

  • OpenGL ES 2.0 纹理在某些设备上不显示

    我找到了一个 Android 3D 图形框架 名为Rajawali我正在学习如何使用它 我遵循了最基本的教程 即使用 1024x512 大小的 jpg 图像作为纹理渲染 shpere 对象 它在 Galaxy Nexus 上运行良好 但在
  • 如何让程序使用 Python GUI 中的输入框等待输入?

    这是我用来启动程序主要部分的函数的代码 但是我想要某种循环或创建十个问题的东西 但在进入下一个问题之前等待来自输入框的输入 有任何想法吗 def StartGame root Tk root title Maths Quiz Trigono
  • 使用 Xcode 4.2 ios 5.0 构建的应用程序安装在装有 ios 4.3.5 的 iPhone 上时崩溃

    我有一个应用程序将不再在 ios 4 x 上构建 上周它运行良好 现在我可以确认有 2 位使用旧版 ios 的人无法在 Test Flight 上启动该应用程序 1 人 ios 4 3 x 无法再在 Xcode 中构建应用程序 调试器输出如
  • 调试代码优先的实体框架迁移代码

    我首先在我的网站中使用实体框架代码 我只是想知道是否有任何方法可以调试迁移代码 你知道 比如设置断点之类的 我正在使用包管理器控制台来更新数据库Update Database Thanks 我知道 EF Code First Migrati
  • setScrollable 不适用于 NSTextFieldCell

    我希望我的每个表格单元格都可以滚动 因为它是可编辑的 我正在使用 self nsChildTextFieldObj NSTextFieldCell alloc init self nsChildTextFieldObj setControl
  • 选择多个选项

    为了一些看似简单的事情而把我的头撞到墙上 这里是
  • R Markdown 中的图形与 html 输出的交叉引用不起作用

    我想展示对我使用 R Markdown 创建的 HTML 文档中的图片的良好交叉引用 然而 即使我跟着关于交叉引用的书本部分 我无法获得在最终 HTML 输出中显示的引用 我在 R Studio 工作 如果有帮助的话 Rmd 文件 titl
  • 列复制并粘贴到行中

    我有一个包含以下内容的文件 sensor write reg client 0x57 0x00 sensor write reg client 0x58 0x00 sensor write reg client 0x59 0x00 sens
  • 将.c文件重命名为.cpp,导入Cython库失败

    我有一个正在运行的 Cython 程序 其中包含一些 C 库和自定义 C 代码 最近 我不得不将我的项目切换到 C 所以我将所有 C 代码重命名为 cpp Cython 编译良好并生成了 so文件 但是 当我尝试在 Python 中导入库时
  • 从现有按钮创建按钮数组(集合)

    有没有一种简单的方法可以从表单上的现有按钮创建按钮集合 在 c 中 我的表单上已经有一系列按钮 我想使用索引来访问它们 例如 myButtonArray 0 ForeColor Do something with it 这可以做到吗 编辑
  • 如何在c中获取时间戳

    我想获取我登录 c 的时间戳 我写了一个函数来获取时间戳 但是当我返回变量时我得到不同的值 My code include
  • 如何使用 Android SDK 和 AVD 管理器下载 Google API(因为它提供 SHA-1 MessageDigest 不可用)?

    我无法使用 Android SDK 和 AVD 管理器下载 Google API 每当尝试时 我都会收到以下错误 SHA 1 MessageDigest 不可用 有什么想法吗 我找到了在 Windows XP 环境中执行此操作的解决方法或正
  • Python:退出for循环?

    我对 SO 做了一些研究 并且知道有人提出了许多类似的问题 但我无法完全得到答案 不管怎样 我正在尝试构建一个库来使用 塞萨尔数字 技术 加密 字符串 这意味着我必须获取该字符串并将每个字母替换为字母表中 X 位置之外的另一个字母 我希望这
  • boost:asio::read 或 boost:asio::async_read 超时

    是的 我知道对此有一些疑问time out in boost asio 我的问题可能太简单了asio大伙在这里解决 我在用boost asio在 TCP 协议上以尽可能快的速度通过网络连续循环读取数据 跟随功能ReadData 不断接到工作
  • jsf 嵌入复合组件后如何禁用 ViewHandler 中的元素?

    如果满足某些条件 我将使用 ViewHandler 阻止任何访问页面上的所有输入元素 这对于 主 xhtml 文件中的输入元素非常有效 但复合组件中的输入元素不会被阻止 我认为这与 JSF 仅在我的 ViewHandler 完成其工作后才嵌
  • 为什么当 dir="rtl" 时表格边距会出错?

    when I change the page direction to rtl the table margins is go incorrect as in this picture but when I only remove the
  • CSS 类特异性顺序

    我定义了自己的 CSS 类 my ui table td border width 1px border 0 padding 5px 10px border style hidden border color inherit 默认 Prim
  • Meteor - 为什么我应该尽可能使用 this.userId 而不是 Meteor.userId() ?

    判断从这条评论作者 David Glasser 在 GitHub 问题中 this userId是主要 API 并且Meteor userId 是 JavaScript 新手的语法糖 他们可能还不了解成功使用它的细节 看来我们应该使用thi
  • Angular ui-router...显示默认选项卡

    我抵达bookDetails状态形成一些其他链接 这里bookDetails州的模板有不同的链接tabs 或模板 及相关控制器EditBookController有一个 json 文件 我使用它以不同的方式构建表单tabs与像这样的国家bo
  • 有没有办法在动态/扩展中执行链接空检查?

    C 有有用的空条件运算符 很好地解释了这个答案 too 我想知道当我的对象是动态 扩展对象时是否可以进行类似的检查 让我向您展示一些代码 给定这个类的层次结构 public class ClsLevel1 public ClsLevel2