获取动态类型的类类型?

4
我编写了一些代码:
    public static object func()
    {
        return new { a = 1, b = 2 };
    }

   Console.WriteLine((func() as dynamic).a); //returns '1'.

如果我可以这样做:func() as dynamic,那么dynamic应该是某种引用类型/类。
我找到了它的Class类型,但是无法通过反射找到任何信息。
它的类型是什么?(引用类型)?
1个回答

6
您可以像平常一样通过GetType()获取类型。
这是一个匿名类型,它是一种泛型类型(作为实现细节)。在C#中,该类型的名称故意无法发音。
如果您查看Reflector,可能会发现一个内部的泛型类型以“2”结尾(表示有两个泛型类型参数),具有两个属性“a”和“b”,分别属于第一个和第二个泛型类型参数。它是一个类,因此是引用类型。
请注意:
new { a = true, b = 123.45 }

实际上会使用相同的通用类型,但使用不同的通用类型参数。

此外;使用dynamic并不会改变对象 - 它只改变访问方式。


由于 int 是 Int32 的别名,那么 dynamic 是否是 xxx 的别名? - Royi Namir
@Royi 啊,但事实上,某些东西实际上可以是 int/Int32(可能被装箱)。没有任何对象实际上是“dynamic”类型的。就像没有任何对象是“IFoo”类型(一个接口)一样。变量(或表达式)是动态类型;这只是告诉编译器如何处理它-它不会改变实际对象。 - Marc Gravell
有什么实际场景可以使用动态(而不是Expando,也不是函数返回类型的上下文)?我知道我正在处理的所有对象,那么在现实生活中,什么情况下会出现“新的未知类型”并需要我处理...? - Royi Namir
@Royi COM或者使用动态语言(例如Iron*)与对象交互都是很好的例子。此外,您可以通过基于模式的方法实现一些有趣的功能 - 可以参考Simple.Data。在大多数常规代码中,接口是更可取的抽象层。 - Marc Gravell

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