动态成员查找
在 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();
动态类型甚至在大多数静态类型代码中都有应用程序,例如,它使得双重调度无需实现访问者模式。