Будет ли динамическое ключевое слово в C # 4 поддерживать методы расширения? - PullRequest
43 голосов
/ 03 ноября 2008

Я слушаю разговор о C # 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?

Примечание: Этот вопрос был задан до того, как C # 4 был отправлен, поэтому он сформулирован в будущем времени.

Ответы [ 4 ]

47 голосов
/ 03 ноября 2008

Из слова "Новые функции в C # 4" документ :

Динамический поиск не сможет найти методы расширения. Будь то методы расширения применяются или нет, зависит в статическом контексте вызова (то есть какие пункты использования встречаются), и эта контекстная информация не в настоящее время хранится как часть полезной нагрузки.

4 голосов
/ 01 декабря 2009

Это работы, которые, по крайней мере, мне интересны ...

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

2 голосов
/ 20 ноября 2008

Это не может работать, методы расширения работают в зависимости от наличия пространства имен, включенного в файл, и, насколько я знаю, MSIL не имеет представления о файлах и в том числе о пространствах имен.

1 голос
/ 01 февраля 2013

Вы можете создать метод расширения для объекта и назначить его для dynamic :

public static void MyExt(this object o) {
    dynamic d = o;
    d.myProp = "foo";
}

и назовите это так:

ClassWithMyProp x;
x.MyExt();
...