有没有办法测试变量是否是动态的?

dav*_*v_i 21 c# dynamic

除非变量vnull:否则以下代码将始终返回true :

v is dynamic
Run Code Online (Sandbox Code Playgroud)

并且以下测试将无法编译("typeof运算符不能用于动态类型"):

v.GetType() == typeof(dynamic)
Run Code Online (Sandbox Code Playgroud)

那么有没有办法测试变量是否dynamic

Mar*_*ell 18

首先,您需要将变量和对象分开.如果变量定义为,则dynamic变量是动态的.就这些.没有更多.一个财产将与被标注[Dynamic]属性,即

public dynamic Foo {get;set;}
Run Code Online (Sandbox Code Playgroud)

实际上是:

[Dynamic]
public object Foo {get;set;}
Run Code Online (Sandbox Code Playgroud)

这基本上作为编译器通过dynamicAPI而不是通过OOP API 访问对象的提示.

如果一个对象dynamic实现了它就支持全部功能IDynamicMetaObjectProvider- 但是,这样的对象可以通过dynamicAPI和常规OOP API(它可以同时具有)来访问.同样,IDynamicMetaObjectProvider可以通过任一API访问未实现的对象(但是:只有公共成员才可以通过dynamic).


Krz*_*lak 12

没有调用CLR类型dynamic.C#编译器生成所有dynamic类型的值,object然后调用自定义绑定代码来确定如何处理它们.如果dynamic使用,它将显示为Object.

但是您可以检查实例是否是类型,IDynamicMetaObjectProvider或者您可以检查类型是否实现IDynamicMetaObjectProvider

  • @MarcGravell,从多态性的观点来看,类Foo实现了IFoo IS-A IFoo.可能我的英语并不完美. (4认同)
  • 一个实例是**永远不会**"类型为'IDynamicMetaObjectProvider`",因为那不是具体类型.类型*可以实现*,当然(该句子的后半部分很好). (2认同)