{
dynamic textData1 = "Hello";
try
{
Console.WriteLine(textData1.ToUpper());
Console.WriteLine(textData1.toupper());
Console.WriteLine(textData1.Foo(10, "ee", DateTime.Now));
}
catch (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException ex)
{
Console.WriteLine(ex.Message);
}
}
Если вызвать метод InvokeMembersOnDynamicData()
ToUpper() (обратите внимание на заглавные буквы "Т" и "U") работает корректно, но затем на консоль выводится сообщение об ошибке:HELLO
'string' does not contain a definition for 'toupper'
Конечно, процесс помещения всех динамических обращений к методам в блоки try/catch
Область использования ключевого слова dynamic
Вспомните, что неявно типизированные данные (объявленные с ключевым словом var
var никогда не может использоваться с возвращаемым значением, параметром или членом класса/структуры. Тем не менее, это не касается ключевого слова dynamic. Взгляните на следующее определение класса:namespace DynamicKeyword
{
class VeryDynamicClass
{
// Динамическое поле.
private static dynamic _myDynamicField;
// Динамическое свойство.
public dynamic DynamicProperty { get; set; }
// Динамический тип возврата и динамический тип параметра.
public dynamic DynamicMethod(dynamic dynamicParam)
{
// Динамическая локальная переменная.
dynamic dynamicLocalVar = "Local variable";
int myInt = 10;
if (dynamicParam is int)
{
return dynamicLocalVar;
}
else
{
return myInt;
}
}
}
}
Теперь обращаться к открытым членам можно было бы ожидаемым образом; однако при работе с динамическими методами и свойствами нет полной уверенности в том, каким будет тип данных! По правде говоря, определение VeryDynamicClass
dynamic.Ограничения ключевого слова dynamic
Невзирая на то, что с использованием ключевого слова dynamic
string и возвращает void:dynamic a = GetDynamicObject();
// Ошибка! Методы на динамических данных не могут использовать
// лямбда-выражения!
a.Method(arg => Console.WriteLine(arg));
Чтобы обойти упомянутое ограничение, понадобится работать с лежащим в основе делегатом напрямую, используя приемы из главы 12. Еще одно ограничение заключается в том, что динамический элемент данных не может воспринимать расширяющие методы (см. главу 11). К сожалению, сказанное касается также всех расширяющих методов из API-интерфейсов LINQ. Следовательно, переменная, объявленная с ключевым словом dynamic
dynamic a = GetDynamicObject();
// Ошибка! Динамические данные не могут найти расширяющий метод Select()!
var data = from d in a select d;
Практическое использование ключевого слова dynamic