首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C#4.0:为什么在有ExpandoObject时有了MethodBag?

在 C# 4.0 中,引入了 ExpandoObject 类型,它允许在运行时动态地添加或删除属性和方法。然而,在引入 ExpandoObject 之前,C# 中的动态对象主要依赖于 IDynamicMetaObjectProvider 接口。这个接口提供了一个名为 GetMetaObject 的方法,该方法返回一个 DynamicMetaObject 实例,用于描述对象的动态行为。

DynamicMetaObject 类型包含一个名为 BindInvokeMember 的方法,该方法用于绑定成员调用。在 C# 4.0 之前,这个方法的实现方式是将所有可能的方法调用都存储在一个名为 MethodBag 的字典中。这个字典的键是方法名称,值是一个包含方法参数类型信息的对象数组。

然而,在引入 ExpandoObject 之后,C# 团队发现这种实现方式不够高效,因为它需要为每个方法调用创建一个新的 MethodInfo 对象。为了解决这个问题,C# 团队引入了一个新的类型 DynamicObject,它提供了一个名为 TryInvokeMember 的方法,用于处理成员调用。与 MethodBag 不同,DynamicObject 使用一个名为 DynamicMethod 的类型来表示动态方法调用,这个类型可以更高效地处理方法调用。

因此,尽管 MethodBag 在 C# 4.0 中已经被弃用,但它在 C# 的早期版本中曾经是一个重要的组成部分,用于支持动态方法调用。如果您需要在 C# 4.0 中使用动态方法调用,建议使用 DynamicObject 类型,因为它比 MethodBag 更高效、更灵活。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

「后端小伙伴来学前端了」为什么Vue在有全局事件总线后还要引入Vuex呢?

---- 思考 不知道大家会不会产生这样的一个疑惑, 全局事件总线 明明已经可以实现任意间组件通信啦,为什么还要额外将 Vuex引入Vue的生态呢?这样的操作不会显得有些重复吗?...这个方法解决兄弟组件或爷爷孙子组件这种层级比较多的组件间的数据传递。 但是这些数据本身存在的地方是在某一个组件的内部,然后其他的组件通过触发回调,来进行数据的修改。...仔细思考思考,我们修改的是一个共享数据,为什么还要两端都写相似且重复的代码呢? 难道我们不能在子组件中写了,然后父组件中就立马检测到数据的变更,然后再更新到视图层吗??...Vuex 也集成到 Vue 的官方调试工具 devtools extension (opens new window),提供诸如零配置的 time-travel 调试、状态快照导入导出等高级调试功能...就相当于定义这样的一个中央仓库,所有组件都能够获取到存在里面的数据,也能够对数据进行操作,一旦数据改变,也会更新使用了相关数据的组件视图。

93620
  • C# 学习笔记(16)—— 动态类型

    这是因为在第 3 行,变量i的类型是动态类型,编译的具体类型只能在程序运行时被确定,编译器根本不知道其类型时什么,所以也就不会出现编译错误了 C# 为什么要引入动态类型 可以减少强制类型转换的使用 从上面代码示例可以看出引入动态类型的好处了...Console.Write("调用Python语言的print函数输出:"); engine.Execute("print 'Hello World'"); Console.Read(); 以上代码实现在...error = numbers.Take(numer); // 编译错误 错误原因很简单:扩展方法在另一个文件被定义,若参数为动态类型,编译器将无法确定参数的具体类型,因此也就不知道该导入哪个源文件。...ExpandoObject 来实现动态行为 ExpandoObject 时实现动态行为最简单的方式,其实现代码如下: using System; using System.Dynamic; namespace...因此实现 IDynamicMetaObjectProvider 接口,我们需要实现一个 GetMetaObject 方法,用以返回 DynamicMetaObject 对象。

    18310

    .NET深入解析LINQ框架(三:LINQ优雅的前奏)

    return this.enumerable.GetEnumerator(); 11 } 在上述代码中的“(1)重点”的地方,我们很清楚的看见表达式树被动态编译后然后紧接着又被执行,这里就能看出为什么...为什么需要动态LINQ查询,上面说过问题出在我们没办法在运行时再去编写Lambda表达式,都知道Lambda表达式到最后就是被编译成Expression表达式树对象,所以我们可以在运行时自己动态的构建...我们将要通过动态的构建表达式树来做为查询的逻辑,以往我们的Lambda在这个时候派不上用场,在运行时我们无法再去构建委托类型。...1 static void Main(string[] args) 2 { 3 dynamic objModel = new ExpandoObject();...//初始化可以动态添加属性、方法、事件的ExpandoObject对象 4 objModel.Name = "王清培";//设置属性值 5 objModel.Age

    1.6K20

    用ASP.NET Core 2.1 建立规范的 REST API -- HATEOAS

    动态类型方案: 需要使用例如匿名类或ExpandoObject等, 对于单个资源可以使用ExpandoObject, 而对于集合类资源则使用匿名类....现在CountryController里面的GET方法返回的是IEnumerable,是塑形后的CountryResource: ?...由于ExpandoObject无法继承我定义的父类,所以只好建立一个方法返回Links: ? 由于数据塑形的存在,参数还要加上fields。...返回Links,为ExpandoObject添加一个links属性,并返回即可。 测试: ? OK。然后我们添加几个数据塑形的参数: ? 仍然OK, self的Link里面的href也带着这些参数。...上面的自定义约束标签RequestHeaderMatchingMediaTypeAttribute的第二个参数meidatypes是个数组,为什么

    86240

    记一次w3wp占用CPU过高的解决过程(Dictionary和线程安全)

    项目上线以来一直存在一个比较揪心的问题,和一个没有信心处理的BUG,那就是在应用程序启动时有可能会导致cpu跑满99%或持续在一个值如50%左右,这样一来对服务器的压力是非常大的,经常出现服务器无法远程的状态...为什么没有信心处理这个问题 原因非常简单,这个问题是间歇性的,不容易重现的,只会在项目启动时有一定的可能性会发生CPU跑满的问题。...发现真的在有些时候cpu会占的非常高有时候又正常。 ? 那么问题也就明朗,解决它也变得非常容易,找到GetRoutes代码,原先是这么实现的 ?...,为什么Add一个项目会造成堵塞?...,这也可以说明了为什么cpu有时候是50%有时候是99%的问题。

    1.1K50

    既然 JVM 有 Full GC,为什么还会出现 OutOfMemoryError?

    ---- 平时有逛知乎的习惯,一般对JVM相关话题比较感兴趣。偶然看到这个问题,结果发现一个很有意思的回复。...问题: 既然在触发Full GC的时候,年老代和持久带都会被清理,那么为什么还会出现OOM问题?...那么Full GC机制的存在有何意义? 还是说FGC主要针对的是驻扎在年老代的软引用?既然如此,对于四种引用的方式如何抉择?总不能所有对象都创建引用队列使用软引用或者弱引用吧?...R大回复 这个问题的意思是: 为什么我请了佣人来收拾房间,我的房间还是会堆满? 那我还请佣人来干什么? 他不是号称能把我房间里的垃圾都清理干净的么?

    27310

    谁将颠覆微信?

    这也就不奇怪年轻人为什么会逃离原本非常喜欢的平台。然而这个现象在目前阶段却没有解药。任何一个社交平台不可能因为一部分年轻用户的逃离而放弃新的、年龄更大的用户,因为这些大龄的用户会带来更多的收入。...根据美国iStrategyLabs的调查,从2011年1月到2014年1月,Facebook上55岁以上的用户增幅达80%,但13—17岁的用户流失25%。...这也是为什么Facebook愿意出高价收购Instagram和Snapchat来作为紧急输血。 如今微信也已面临同样的问题,在其逐渐全民化的时候,年轻人已经开始逃离微信。...现在有“二次元”,当年有“动漫”;现在有“无节操”,当时有“重口味”;现在有“脑洞大开”,当时有“脑残”。...这和我们年轻时有什么不一样呢? 所以,未来肯定会出现新的社交产品而颠覆现有的平台。 来源:商业周刊中文版 作者:田行智(新社交应用碰碰联合创始人)

    32660

    想从事大数据、海量数据处理相关的工作,如何自学打基础?

    在有一个高大上的职业叫数据科学家,有人说数据科学家就是一个比程序员更懂统计的统计学家,一个比统计学家更会编程的程序员。觉得说得很形象。...比如有Hive为什么facebook还要搞Presto;为什么Hadoop 2.0要做Yarn。看的时候多想想这个,视野就会更开阔。...t01e43ae4a9ddc23844.jpg 所以说,没有比找一家公司真的干一段时间更能让你了解大数据的。当然请别被忽悠去拿大数据做噱头的公司。...现在有些公司招聘,就算不用hadoop也会往上写,反正去了老板会说,现在数据不够,以后肯定会需要Hadoop的。 以上都是关于平台方向的,数据方向的我完全不懂。...同时有R语言,Python语言mysql Spss SAS 等知识课件和内容分享。Hadoop spark linux Hive等知识分享.

    51061

    中国的程序员群体是否已经过多了

    [1] 题目描述:本人刚刚计算机专业毕业,感觉有好多其他专业的人会转入计算机行业,而且不单单大学学习计算机,好多培育机构异常火爆(甚至培训班都上市,可想其火爆程度),可为什么就没听过其他专业有培训班呢...所以,归根结底还是看兴趣,但也不用到那种媒体里渲染的 geek 的地步,只需不时有思考即可。...但在有的公司机械的考leetcode情况下,容易刷着刷着就混淆目的和手段,这是人之常情。但我们自己要明白这两者区别,还可以有很多其他手段可以提升这种代码和算法能力。...那为什么我还推荐 leetcode 呢?因为他实践性最强,反馈最快,讨论区里还有很棒的的奇思妙想。但再次强调,这只是一种手段。错的是机械的考leetcode题的面试官,不是我们。

    27510

    热点数据更新导致CPU100%的解决方案

    专栏持续更新中:MySQL详解 前言 在平常的工作中,更新数据是再正常不过的一个需求,我们只需要执行一个update语句即可,如果有必要我们还可以加上事务来保证数据的可靠性。...但是如果这是一个热点数据,就比如说直播下单,如果这个商品很火爆,价格又很低,那么就会有很多人下单,这种下单不像秒杀,秒杀是有限制数量,但是这种直播下单是不限量的,可以同时有很多人在下单,这时候用户来下单...这时候,这个库存就成了热点数据,因为如果有几万人同时下单,那么就会导致同时有几万个线程来更新这个库存数据。这时候我们的CPU就会瞬间达到100%。就有可能出现一些异常情况,导致用户下单业务受到影响。...为什么会导致CPU飙升 这时候就要谈到MySql的行锁。在我们执行一条update语句的时候,这时候MySql会开启一个事务,并且对这条记录进行加锁。...比如我们现在有1万个库存,那么我们可以搞10台服务器,也就是10台MySql服务器。每台服务器上都只放1000个库存,这样我们就可以将压力分摊在这10台服务器。

    14610

    【Embedding】GloVe:大规模语料中快速训练词向量

    Introduction 今天学的论文是斯坦福大学 2014 年的工作《GloVe: Global Vectors for Word Representation》,在当时有两种主流的 Word Embedding...在看论文前我们不妨来思考一下,如果你是研究员,现在有这样的想法(综合全局信息和局部信息),你该如何去实现? 2....至此,我们的论文就结束。但我看完这篇论文还有一个非常大的疑惑:GloVe 是怎么训练的呢? 4. Training image.png 那么问题来了:为什么不用一个矩阵和一个偏置项呢?...Conclusion 至此,我们便结束 GloVe 的介绍,用一句话总结便是:GloVe 使用具有全局信息的共现矩阵,并采用类似矩阵分解的方式求解词向量,通过修改代价函数将 Word2Vec 关注局部特征的优点加入进来

    1.3K20
    领券