C# 匿名类型之 RuntimeBinderException

匿名类型在某些场景下使用起来还是比较方便,比如某个类型只会使用一次,那这个时候定义一个 Class 就没有多少意义,完全可以使用匿名类型来解决,但是在跨项目使用时,还是需要注意避免出现 RuntimeBinderException 问题

问题描述

比如我们有一个 netstandard2.0 类型的类库项目,里面有一个这样的方法:

    public static class StandardClass
    {
        public static dynamic Get()
        {
            return new { prop1 = "hello", prop2 = 12 };
        }
    }

然后在一个 net6.0 类型的控制台项目添加下述实例代码

using ClassLibrary1;

try
{
    var test = StandardClass.Get();
    var prop1 = test.prop1;
}
catch (Exception e)
{
    Console.WriteLine(e);
    throw;
}

这个时候,当我们尝试运行这个控制台项目获取 prop1 值,这个时候,就会喜提 RuntimeBinderException

解决方案

因为匿名类型默认是 Internal 的访问级别。这就意味着如果是同一个程序集中通过Dynamic 类型来访问这个匿名对象是没有问题,但是如果跨程序集就会导致 RuntimeBinder 无法识别这种类型,从而也就引发了 RuntimeBinderException 异常。解决这种问题有 2 种方法:

  • 修改返回类型为强类型,取消匿名类型
  • 添加 InternalsVisibleTo 属性,让 Internal 级别的对象对外暴露(如下图所示)

C# 匿名类型之 RuntimeBinderException

相关参考

原文链接:https://www.cnblogs.com/hippieZhou/archive/2023/04/13/17316378.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# 匿名类型之 RuntimeBinderException - Python技术站

(0)
上一篇 2023年4月17日
下一篇 2023年4月17日

相关文章

  • C#中的除法运算符与VB.NET中的除法运算符

    好的。针对“C#中的除法运算符与VB.NET中的除法运算符”,我会就这个话题,进行详细讲解,以下是完整的攻略: C#中的除法运算符 / C#中的除法运算符 / 是将两个数相除并返回结果的算术运算符。如果两个操作数都是整数,则返回的结果也是整数,省略小数部分。如果其中一个操作数是浮点数,则返回的结果也是浮点数,包括小数部分。下面是一个简单的示例: int a …

    C# 2023年6月7日
    00
  • C#记一次http协议multipart/form-data的boundary问题

    下面是“C#记一次http协议multipart/form-data的boundary问题”的完整攻略。 1. 问题背景 在使用 C# 发送 HTTP 请求时,如果请求体采用 multipart/form-data 格式,则需要在请求头和请求体中添加对应 “Content-Type” 和 “Boundary”。其中 “Boundary” 是分割每个 form…

    C# 2023年5月15日
    00
  • C# 通过反射获取类型的字段值及给字段赋值的操作

    C#通过反射获取类型的字段值及给字段赋值的操作,可以通过以下步骤进行: 1. 获取类型对象 获取类型对象可以通过两种方式进行,一种是通过已知对象获取,另一种是通过类型名称字符串获取。以下是两种方式的示例代码: 通过已知对象获取 MyClass obj = new MyClass(); Type type = obj.GetType(); 通过类型名称字符串获…

    C# 2023年5月15日
    00
  • linq中的连接操作符

    当我们在使用Linq时,有时候我们需要将两个数据源进行连接(Join)操作,LINQ提供了以下几种连接操作符: Inner Join(join in) Left Outer Join (join…into…from…DefaultIfEmpty) Right Outer Join (join…into…from…DefaultIfEm…

    C# 2023年6月1日
    00
  • Redis总结笔记(二):C#连接Redis简单例子

    这篇文章是讲解如何在C#中连接Redis数据库,并进行简单的操作。文章会包含以下几个部分: 环境准备 Nuget安装Redis库 Redis连接与配置 Redis常用操作示例 1. 环境准备 在C#中连接Redis之前,需要确保本地已经安装好了Redis数据库,并且正在运行。可在Redis官网下载安装Redis,也可以下载Redis Desktop Mana…

    C# 2023年5月31日
    00
  • Windows系统自动连接网络共享打印机BAT脚本分享

    下面我将为你详细讲解“Windows系统自动连接网络共享打印机BAT脚本分享”的完整攻略。 背景 在Windows系统中,我们可以通过在本地网络中连接打印机,实现通过局域网打印文件的功能。然而,在每次使用时都需要手动连接,对日常使用造成了不必要的麻烦。为了解决这个问题,我们可以使用BAT脚本来实现网络共享打印机的自动连接。 实现步骤 1. 打开记事本 在Wi…

    C# 2023年6月7日
    00
  • C# 数组删除元素的实现示例

    C# 数组删除元素的实现示例 在 C# 中,我们可以使用多种方式删除数组中的元素。本文介绍两种最常见的方法。 方法一:使用 Linq 扩展方法实现 使用 Linq 扩展方法可以优雅地实现对数组的删除操作。下面是示例代码: int[] arr = { 1, 2, 3, 4, 5 }; arr = arr.Where(x => x != 3).ToArra…

    C# 2023年6月7日
    00
  • 如何解决SpringBoot2.x版本对Velocity模板不支持的方案

    当我们使用Spring Boot 2.x版本时,发现Velocity模板不被支持,我们需要重新配置才能使其正常工作。下面是一些解决方法: 1. 添加Velocity的依赖 在pom.xml文件中添加如下代码,引入Velocity的依赖 <dependency> <groupId>org.apache.velocity</grou…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部