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

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(使用前将#替换为@)

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

随机推荐

  • 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