动态对象 - 运行时报告字段不存在,但可以在调试器中看到它?

2024-03-05

编辑:重新启动 Visual Studio 修复了此问题,无需更改代码。


我有一个使用动态类型和 Expando 对象的 ConfigSection 处理程序。测试失败报告“object”不包含“SportName”的定义。我尝试在控制台中进行复制,将 ConfigSection 处理程序排除在等式之外,但看起来等效的代码工作正常。我很困惑。

请参阅下面的测试、ConfigurationSectionHandler 和配置 xml

public class SportSection : IConfigurationSectionHandler
{
    public object Create(object parent, object configContext, XmlNode section)
    {
        var doc = XDocument.Parse(section.OuterXml);
        var root = (XElement)doc.FirstNode;

        try
        {
            var sportList = root.Element("sportList").Elements("sport").Select(ToSport);

            dynamic config = new ExpandoObject();
            config.SportList = sportList;

            return config;
        }
        catch (Exception ex)
        {
            throw new ConfigurationErrorsException("Invalid SportSection configuration", ex);
        }
    }

    private static dynamic ToSport(XElement sportElement)
    {
        try
        {
            var getAttrib = new Func<XElement, string, string>((x, atr) => x.Attribute(atr).Value);
            var getDictionary =
                new Func<IEnumerable<XElement>, IDictionary<string, string>>(elems => elems.ToDictionary(x => x.Attribute("name").Value, y => y.Attribute("value").Value));

            return new
            {
                SportName = sportElement.Attribute("name").Value,
                EventProperties = getDictionary(sportElement.Element("eventProperties").Elements("property")),
                CompetitionProperties = getDictionary(sportElement.Element("competitionProperties").Elements("property")),
                MappedMarkets = sportElement.Element("mapping").Elements("market").Select(x => new MappedMarket() { Type = getAttrib(x, "type"), MappedType = getAttrib(x, "mappedType") })
            };
        }
        catch (Exception ex)
        {

            throw ex;
        }

    }
}


[Test]
    public void GoodConfig()
    {
        var document = new XmlDocument();
        document.LoadXml(Resources.ValidSportSectionConfig);

        var config = new SportSection().Create(null, null, document) as dynamic;

        IEnumerable<dynamic> sportList = config.SportList;

        Assert.AreEqual(1, sportList.Count());
        //Microsoft.CSharp.RuntimeBinder.RuntimeBinderException : 'object' does not contain a definition for 'SportName'
        Assert.AreEqual("Baseball", sportList.Select(x => (string) x.SportName).First()); 

        var eventProperties = sportList.First(x => x.SportName == "Baseball").EventProperties as IDictionary<string, string>;

        Assert.AreEqual(2, eventProperties.Count);
        Assert.AreEqual("BSB", eventProperties["SportId"]);
        Assert.AreEqual("THA", eventProperties["CompetitorReferenceId"]);

        var compProps = sportList.First(x => x.SportName == "Baseball").CompetitionProperties as IDictionary<string, string>;
        Assert.AreEqual(2, compProps.Count);
        Assert.AreEqual("BSB", compProps["SportId"]);
        Assert.AreEqual("CUP", compProps["CompetitionOrgMethodId"]);

        var mappedMarkets = (sportList.First(x => x.SportName == "Baseball").MappedMarkets as IEnumerable<MappedMarket>).ToList();
        Assert.AreEqual(2, mappedMarkets.Count());
        Assert.AreEqual("match_winner" , mappedMarkets[0].Type);
        Assert.AreEqual("BSBAO", mappedMarkets[0].MappedType);
        Assert.AreEqual("handicap", mappedMarkets[0].Type);
        Assert.AreEqual("BSBAQ", mappedMarkets[0].MappedType);
    }

<sportSettings>
  <sportList>
    <sport name="Baseball">
    <eventProperties>
      <property name="SportId" value="BSB"></property>
      <property name="CompetitorReferenceId" value="THA"></property>
    </eventProperties>
    <competitionProperties>
      <property name="SportId" value="BSB" />
      <property name="CompetitionOrgMethodId" value="CUP" />
    </competitionProperties>
    <mapping>
      <market type="match_winner" mappedType="BSBAO" />
      <market type="handicap" mappedType="BSBAQ" />
    </mapping>
    </sport>
  </sportList>
</sportSettings>

UPDATE- 堆栈跟踪:

at CallSite.Target(Closure , CallSite , Object )
at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0)
at SS.Integration.EVenue.WindowsService.UnitTests.Configuration.SportSectionTests.<GoodConfig>b__11(Object x) in C:\_Git\SS.Integration.EVenue\SS.Integration.EVenue.WindowsService.UnitTests\Configuration\SportSectionTests.cs:line 35

ToSport返回匿名类型而不是ExpandoObject。将匿名类型强制转换为动态时必须小心,因为这些类型的访问修饰符为internal。因此,如果跨越程序集边界,运行时将看不到任何可访问的属性。尝试:

 private static dynamic ToSport(XElement sportElement)
    {
        try
        {
            var getAttrib = new Func<XElement, string, string>((x, atr) => x.Attribute(atr).Value);
            var getDictionary =
                new Func<IEnumerable<XElement>, IDictionary<string, string>>(elems => elems.ToDictionary(x => x.Attribute("name").Value, y => y.Attribute("value").Value));


            dynamic n = new ExpandoObject();
            n.SportName = sportElement.Attribute("name").Value;
            n.EventProperties = getDictionary(sportElement.Element("eventProperties").Elements("property"));
            n.CompetitionProperties = getDictionary(sportElement.Element("competitionProperties").Elements("property"));
            n.MappedMarkets = sportElement.Element("mapping").Elements("market").Select(x => new MappedMarket() { Type = getAttrib(x, "type"), MappedType = getAttrib(x, "mappedType") });

            return n;
        }
        catch (Exception ex)
        {

            throw ex;
        }

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

动态对象 - 运行时报告字段不存在,但可以在调试器中看到它? 的相关文章

  • 在 VS2017 下使用 Conan 和 CMake 项目进行依赖管理

    我正在尝试使用 CMake 与 VS2017 集成为 C 设置一个开发环境 以便在 Linux x64 下进行编译 为了更好地管理依赖关系 我选择使用 Conan 但我对这个软件还很陌生 我想知道让 VS2017 识别项目依赖关系的最佳方法
  • 如何使用 zlib 制作 .zip 文件

    我正在阅读zlib的文档 它相当详细 但我读到了这一行 输出数据将位于zlib格式 与 gzip 或zip formats http www zlib net zlib how html http www zlib net zlib how
  • 分段错误(核心转储)错误

    我的程序编译罚款 但在输入文件时出现 分段错误 核心转储 错误 我没有正确处理 ostream 吗 include
  • C 程序从连接到系统的 USB 设备读取数据

    我正在尝试从连接到系统 USB 端口的 USB 设备 例如随身碟 获取数据 在这里 我可以打开设备文件并读取一些随机原始数据 但我想获取像 minicom teraterm 这样的数据 请让我知道我可以使用哪些方法和库来成功完成此操作以及如
  • System.IO.IOException:由于意外>数据包格式,握手失败?

    有谁知道这意味着什么 System Net WebException 底层连接已关闭 发送时发生意外错误 gt System IO IOException 由于意外 握手失败 数据包格式 在 System Net Security SslS
  • 为什么Apache MPM prefork.c 使用互斥体来保护accept()?

    我坐下来读书Apache 的 MPM prefork c http code metager de source xref apache httpd server mpm prefork prefork c这段代码使用了一个名为accept
  • 为什么大多数平台上没有“aligned_realloc”?

    MSVC有自己的非标准函数 aligned malloc aligned realloc and aligned free C 17和C11引入了 std aligned alloc 其结果可以是de分配有free or realloc B
  • (const T v) 在 C 中从来都不是必需的,对吗?

    例如 void func const int i 在这里 const是不必要的 因为所有参数都是按值传递的 包括指针 真的吗 C 中的所有参数确实都是按值传递 这意味着无论您是否包含该参数 实际参数都不会改变const or not 然而
  • 如何生成 appsettings..json 文件?

    我有一个 ASP NET Core 2 WebAPI 它将部署在以下环境中 INT QA STAGE 生产环境 基于上述 我需要有appsettings
  • 劫持系统调用

    我正在编写一个内核模块 我需要劫持 包装一些系统调用 我正在暴力破解 sys call table 地址 并使用 cr0 来禁用 启用页面保护 到目前为止一切顺利 一旦完成 我将公开整个代码 因此如果有人愿意 我可以更新这个问题 无论如何
  • 将带有 glut 的点击坐标添加到向量链接列表中

    我想创建一个向量链接列表 并在 GLUT 库的帮助下获取点击的位置并将它们附加到链接列表中 这些是我写的结构 typedef struct vector int x int y Vector typedef struct VectorLis
  • C# 委托责任链

    为了我的理解目的 我实现了责任链模式 Abstract Base Type public abstract class CustomerServiceDesk protected CustomerServiceDesk nextHandle
  • 为什么 clang 使用 -O0 生成低效的 asm(对于这个简单的浮点和)?

    我正在 llvm clang Apple LLVM 版本 8 0 0 clang 800 0 42 1 上反汇编此代码 int main float a 0 151234 float b 0 2 float c a b printf f c
  • C++ 错误 - “成员初始值设定项表达式列表被视为复合表达式”

    我收到一个我不熟悉的 C 编译器错误 可能是一个非常愚蠢的错误 但我不能完全指出它 Error test cpp 27 error member initializer expression list treated as compound
  • .NET 客户端中 Google 表格中的条件格式请求

    我知道如何在 Google Sheets API 中对值和其他格式进行批量电子表格更新请求 但条件格式似乎有所不同 我已正确设置请求 AddConditionalFormatRuleRequest formatRequest new Add
  • WPF。如何从另一个窗口隐藏/显示主窗口

    我有两个窗口 MainWindow 和 Login 显示登录的按钮位于主窗口 this Hide Login li new Login li Show 登录窗口上有一个检查密码的按钮 如果密码正确 我如何显示主窗口 将参数传递给 MainW
  • 0-1背包算法

    以下 0 1 背包问题是否可解 浮动 正值和 浮动 权重 可以是正数或负数 背包的 浮动 容量 gt 0 我平均有 这是一个相对简单的二进制程序 我建议用蛮力进行修剪 如果任何时候你超过了允许的重量 你不需要尝试其他物品的组合 你可以丢弃整
  • 在 C++17 中使用 成员的链接错误

    我在 Ubuntu 16 04 上使用 gcc 7 2 并且需要使用 C 17 中的新文件系统库 尽管确实有一个名为experimental filesystem的库 但我无法使用它的任何成员 例如 当我尝试编译此文件时 include
  • 在 Xamarin 中获取 OutOfMemoryException

    java lang OutOfMemoryError 考虑增加 JavaMaximumHeapSize Java 执行时内存不足 java exe 我的 Visualstudio Xamarin 项目出现内存不足异常 请帮助我如何解决此问题
  • C#中为线程指定特殊的cpu

    我有 2 个线程 我想告诉其中一个在第一个 cpu 上运行 第二个在第二个 cpu 上运行 例如在具有两个 cpu 的机器中 我怎样才能做到这一点 这是我的代码 UCI UCIMain new UCI Thread UCIThread ne

随机推荐

  • 使用 (wx)python 记录外部程序的输出

    我正在编写一个 GUI 用于使用 oracle exp imp 命令并通过 sqlplus 启动 sql 脚本 子进程类可以轻松启动命令 但我需要一些附加功能 我想在使用 wxPython GUI 时摆脱命令提示符 但我仍然需要一种方法来显
  • 我的 Visual Force 页面上的 Google 地图未将所有标记显示为获取的结果数

    我正在尝试开发一个显示 程序位置 的视觉力页面 在页面加载时 它会获取所有程序并使用标记显示在地图上 有一些过滤器可用于减少结果集并查看特定程序 一切正常 除了页面加载时 我的结果表位于 Google 地图 div 下方 显示 16 条记录
  • OpenID:尝试从 Google OP 获取电子邮件地址

    我正在使用 dotnetopenauth 3 2 来实现 Openid 但不知道如何让 Google 在声明响应中传递电子邮件地址 我知道 Google 不支持简单注册 但我无法确定他们支持什么 对这个问题的警告是 我刚刚开始学习 Open
  • XmlReader - 自关闭元素不会触发 EndElement 事件?

    我在 NET 中使用 XmlReader 使用循环解析 XML 文件 while xml Read switch xml NodeType case XmlNodeType Element Do something case XmlNode
  • iOS 上基于时间的 UUID(版本 1)?

    我们如何使用 iOS 创建 RFC 4122 投诉 UUID 版本 1 基于时间 这是man page https developer apple com library archive documentation System Conce
  • Woocommerce WC_Order get_shipping_address() 未作为数组返回

    从 Woocommerce 检索订单信息时 它指出它应该是一个数组 请参阅 http docs woothemes com wc apidocs class WC Order html get shipping address http d
  • 从另一个 DataFrame 填充 NaN 值(具有不同的形状)

    我正在寻找一种更快的方法来提高解决方案的性能 以解决以下问题 某个 DataFrame 有两列 其中有一些列NaN他们身上的价值观 挑战在于取代这些NaNs带有来自辅助 DataFrame 的值 下面我将分享用于实现我的方法的数据和代码 让
  • 哈希集处理以避免迭代期间陷入循环

    我正在研究图像挖掘项目 我使用 Hashset 而不是数组来避免在收集 url 时添加重复的 url 我到达了代码点以迭代包含主 url 的 Hashset 并在迭代中下载主 URL 的页面并将它们添加到哈希表中 然后继续 在迭代期间我应该
  • 数据库模式规范化检查器?

    我有兴趣了解如下操作的工具 给定一个数据库模式和一些数据 建议该模式是否可能以任何特定的范式构建 然后告诉如何分解该模式以产生进一步的规范化 基本上 是一个用于数据库模式设计的静态分析工具 与其他静态分析工具一样 这样的数据库工具不需要生成
  • Python Numpy 外积将函数列表应用于参数列表而不使用 For 循环

    我有一个数字数组和一个函数列表 我想对每个数字运行每个函数以获取矩阵 有没有一种方法可以在不使用缓慢的Python循环 映射的情况下做到这一点 import numpy arr numpy array 1 2 3 4 5 fns numpy
  • C++ 中的 Ada 子类型等效项

    C 是否提供类似于 Ada 的功能subtype缩小类型 E g type Weekday is Monday Tuesday Wednesday Thursday Friday Saturday Sunday subtype Workin
  • Xcode 7.0.1 - 无效的 Swift 支持 - 缺少 SwiftSupport 文件夹。

    我尝试在 AppStore 上发布包含 Swift 2 0 文件的应用程序 但收到以下电子邮件 亲爱的开发者 我们发现您最近的交货存在一个或多个问题 米兰情绪 要处理您的交货 必须解决以下问题 更正 无效的 Swift 支持 缺少 Swif
  • React.js - 语法错误:这是 render() 函数中的保留字

    我遇到了保留关键字 this 的错误 在下面的 React 组件中 我将状态从主组件 App js 传递到 RecipeList js 组件 然后映射数据并渲染每个 RecipeItem 组件 我只是不明白为什么会出现这个错误 React
  • gcc/g++ 输出类型

    我知道这是一个非常基本的问题 但是当我用 gcc g 编译我的 c c 代码时 在汇编器开始生成机器代码之前中间输出的类型到底是什么 是类似X86指令的东西吗 GCC的处理链如下 你的源代码 预处理的源代码 展开宏并包含 去除注释 E ii
  • iPhone Ad Hoc 分发无期限

    背景故事 我在一家开发和制造商业产品的公司工作 该产品在一个农场中可以拥有多达 100 多台专用 PC 我们每年只获得少数新客户 我们开发了一款 iPod iPhone 应用程序 可以让我们向农场发送命令并提取数据 我们的母公司非常担心将此
  • iOS 使用 UIActivityViewController 共享 CSV 文件

    我有一个共享 CSV 文件的应用程序 我还共享与内置选项 例如邮件 和外部选项 例如 Gmail 应用程序或 Evernote 完美配合的其他文件 如果我尝试共享 CSV 文件 内部邮件选项将按预期工作 但其他选项 例如 Gmail 或 E
  • 如何按类别用百分比注释计数图

    嗨 我正在尝试将百分比添加到我的countplot有 5 个类别和 2 个值 旧的和新的 我尝试添加 def 和循环如何在seaborn中的条形顶部添加百分比 https stackoverflow com questions 317494
  • React 中 Axios 调用时 API 中的 PHP-Session 发生变化

    我正在使用 PHP 编写 Api 该 Api 由 React Web 客户端调用 我使用 Axio 来调用 Api 当我向 Api 发送内容时 SessionID 不是持久的 它在每次调用后都会更改 有人有什么想法吗 简化的 PHP Api
  • 在 SWI-Prolog 中,是否有一种简单的方法可以使用 REPL 将数字从一个基数转换为另一个基数?

    在使用 REPL 的 SWI Prolog 中 可以轻松地从任何基数转换为基数 10 例如 X 16 FF X 255 X 2 11111111 X 255 然而这失败了 没想到它会起作用 但显示了我的想法 2 X 16 FF ERROR
  • 动态对象 - 运行时报告字段不存在,但可以在调试器中看到它?

    编辑 重新启动 Visual Studio 修复了此问题 无需更改代码 我有一个使用动态类型和 Expando 对象的 ConfigSection 处理程序 测试失败报告 object 不包含 SportName 的定义 我尝试在控制台中进