反射一个动态类型以确定它是否一开始就是动态类型

3

有没有一种方法可以判断一个对象被分配的类型是否是动态类型?

例如:

dynamic foo = GetCat();

Console.WriteLine( (foo is Cat).ToString() ); // will print True because
// at the execution time, foo will have assumed the Cat type. However, is
// there a mechanism by which I can reflect on foo and say, "This guy was assigned
// a dynamic type, to begin with."?

我认为这不可能,但由于我不完全确定,我会等待并查看有什么答案。 ;) - Lucero
出于好奇,你为什么想知道? - Eric Lippert
嗨,Eric,我以为你的评论是针对Lucero的。但现在我怀疑它是针对我的原始问题的。我已经发送了一封私人电子邮件到您的官方电子邮件地址,并回答了您的问题。 - Water Cooler v2
1个回答

3
有没有办法判断对象分配的类型是否为动态类型?
如果foo是一个局部变量,那么就没有办法了。"dynamic"是编译时的特性。它只是向编译器发出的提示,表示“不必在编译时尝试对此表达式进行类型分析;相反,在运行时生成调用编译器的特殊版本的代码”。
在运行时,局部变量foo仅是一个类型为object的局部变量,而局部变量的内容是Cat的引用。编译器知道代码的作者想避免在编译时对foo进行类型分析的事实已经丢失了。
通过使用反射检查方法上生成的编译器属性,确实有可能弄清楚返回对象是否真的返回了动态类型。

方法返回动态类型的属性是什么?我在返回动态类型的字段或属性上看到了“DynamicAttribute”,但是当我反射它时,这个属性在返回'dynamic'的方法上似乎没有出现(至少在我的测试用例中没有)。 - Ken Beckett
这种方法不适用于方法的一个例子在这里:https://dev59.com/L17Va4cB1Zd3GeqPGhx5 - Ken Beckett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接