C# 匿名类型之 RuntimeBinderException

这篇具有很好参考价值的文章主要介绍了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.toymoban.com/news/detail-412563.html

相关参考

  • C#‘dynamic’cannot access properties from anonymous types declared in another assembly

到了这里,关于C# 匿名类型之 RuntimeBinderException的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#学习,委托,事件,泛型,匿名方法

    目录 委托 声明委托 实例化委托 委托的多播 委托的用途 事件 通过事件使用委托 声明事件 泛型 泛型的特性 泛型方法 泛型的委托 匿名方法 编写匿名方法的语法 类似于指针,委托是存有对某个方法的引用的一种引用类型变量,引用可以在运行时被改变。特别用于实现事件和

    2024年02月12日
    浏览(46)
  • C# Func和匿名方法 简单使用

    .NET Framework 3.5 引入了变体支持,用于在 C# 中匹配所有委托的方法签名和委托类型。 这表明不仅可以将具有匹配签名的方法分配给委托,还可以将返回派生程度较大的派生类型的方法分配给委托(协变),或者如果方法所接受参数的派生类型所具有的派生程度小于委托类型指

    2024年02月15日
    浏览(46)
  • C# 匿名方法和Lambda表达式

    1.匿名方法的演变 匿名方法是为了简化委托的实现,方便调用委托方法而出现的,同时,匿名方法也是学好lambda表达式的基础。在委托调用的方法中,如果方法只被调用一次,这个时候我们就没有必要创建具名方法,从而用匿名方法更为方便。 下面一段代码是声明并使用了一

    2024年02月15日
    浏览(45)
  • 【C#进阶】C#中的委托、事件、回调函数、匿名函数和lambda表达式

    委托是一种类型,它可以存储对一个或多个方法的引用。它类似于C/C++中的函数指针,允许您将方法作为参数传递、存储和调用。 写法: delegate return_type delegate_name( ); return_type :表示委托所引用方法的返回类型。 delegate_name :表示委托的名称。 parameters :表示委托所引用方法

    2024年02月06日
    浏览(58)
  • C#学习相关系列之匿名方法和Lambda表达式

            匿名方法 顾名思义就是这类方法的特点是不需要特别去定义函数的名字的。一般我们需要一个函数,但又不想花时间去命名它的时候,就可以使用匿名方法。在 C# 中, 匿名方法通常表现为使用 delegate 运算符和 Lambda 表达式。( Lambda 表达式 的本质也是 匿名方法

    2024年02月07日
    浏览(54)
  • c#值类型和引用类型

    1:值类型继承自system.valueType,引用类型继承自system.objectType. 值类型: 存储在栈内存中。 包括整数、浮点数、字符、布尔值和结构体等。 复制时会创建一个完全独立的副本。 引用类型: 存储在堆内存中,而变量本身存储在栈内存中,指向堆内存中的对象。 包括类、接口、

    2024年01月20日
    浏览(42)
  • C# 值类型和引用类型

    传递就是拷贝, a = b 意味着在内存里我讲b的所有复制了一份(复制到 a 这里) 类似 C 函数传实参 传递的是地址 a = b 意味着我将 a 也指向了 b 所指向的内存 类似 C 函数传指针

    2024年03月28日
    浏览(42)
  • C#的值类型和引用类型

    在C#中,数据类型可以分为值类型(Value Types)和引用类型(Reference Types)两种。下面是对它们的详细解释和示例说明: 值类型(Value Types): 值类型变量直接包含它们的数据,存储在栈上。 值类型包括整数类型(如int、byte、char)、浮点类型(如float、double)、布尔类型(如

    2024年02月15日
    浏览(44)
  • 【C# Programming】值类型、良构类型

    1、值类型         值类型的变量直接包含值。换言之, 变量引用的位置就是值内存中实际存储的位置。 2、引用类型         引用类型的变量存储的是对一个对象实例的引用(通常为内存地址)。         复制引用类型的值时,复制的只是引用。这个引用非常小(

    2024年02月07日
    浏览(31)
  • 重温C#中的值类型和引用类型

    在C#中,数据类型分为 值类型 和 引用类型 两种。 引用类型变量存储的是数据的引用,数据存储在数据堆中,而值类型变量直接存储数据。对于引用类型,两个变量可以引用同一个对象。因此,对一个变量的操作可能会影响另一个变量引用的对象。对于值类型,每个变量都有

    2024年02月15日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包