Будет ли ключевое слово dynamic в C # 4 поддерживать методы расширения?
-
06-07-2019 - |
Вопрос
I'm слушая разговор о нас C#4's dynamic
ключевое слово, и мне интересно...Будет ли эта функция ортогональна другим функциям .NET, например, будет ли она поддерживать методы расширения?
public static class StrExtension {
public static string twice(this string str) { return str + str; }
}
...
dynamic x = "Yo";
x.twice(); // will this work?
Примечание: Этот вопрос был задан до того, как C # 4 был отправлен, именно поэтому он сформулирован в будущем времени.
Решение
Из " новых функций в C # 4 " слово doc :
Динамический поиск не сможет найти методы расширения. Будь то методы расширения применяются или нет, зависит в статическом контексте вызова (то есть какие пункты использования встречаются), и эта контекстная информация не в настоящее время хранится как часть полезной нагрузки.
Другие советы
Это работает, и я нахожу это, по крайней мере, интересным...
public static class StrExtension
{
public static string twice(this string str) { return str + str; }
}
...
dynamic x = "Yo";
StrExtension.twice(x);
Тем не менее, если компилятор может найти правильный метод расширения во время компиляции, то я не понимаю, почему он не может упаковать набор методов расширения для поиска во время выполнения?Это было бы похоже на v-таблицу для методов, не являющихся членами.
Редактировать:
Это круто... http://www2.research.att.com /~bs/multimethods.pdf
Это не может работать, методы расширения работают в зависимости от того, включено ли пространство имен в файл, и, насколько я знаю, MSIL не имеет представления о файлах и в том числе о пространствах имен. Р>
Вы можете создать метод расширения для объекта и назначить его для динамического :
public static void MyExt(this object o) {
dynamic d = o;
d.myProp = "foo";
}
и назовите это так:
ClassWithMyProp x;
x.MyExt();