动态成员查找

在 C#类型系统中引入了新的伪类型 dynamic。它被视为 System.Object,但此外,允许任何成员访问(方法调用,字段,属性或索引器访问,或委托调用)或运算符对此类型的值的应用而不进行任何类型检查,并且决议推迟到运行时间。这被称为鸭子打字或后期绑定。例如:

// Returns the value of Length property or field of any object
int GetLength(dynamic obj)
{
    return obj.Length;
}
  
GetLength("Hello, world");        // a string has a Length property,
GetLength(new int[] { 1, 2, 3 }); // and so does an array,
GetLength(42);                    // but not an integer - an exception will be thrown
                                  // in GetLength method at run-time

在这种情况下,动态类型用于避免更详细的反射。它仍然在引擎盖下使用 Reflection,但由于缓存,它通常更快。

此功能主要针对与动态语言的互操作性。

// Initialize the engine and execute a file
var runtime = ScriptRuntime.CreateFromConfiguration();
dynamic globals = runtime.Globals;
runtime.ExecuteFile("Calc.rb");

// Use Calc type from Ruby
dynamic calc = globals.Calc.@new();
calc.valueA = 1337;
calc.valueB = 666;
dynamic answer = calc.Calculate();

动态类型甚至在大多数静态类型代码中都有应用程序,例如,它使得双重调度无需实现访问者模式。