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