Будет ли динамическое ключевое слово в C#4 поддерживать методы расширения?
Я слушаю разговор о C#4dynamic
ключевое слово и мне интересно... Будет ли эта функция ортогональной к другим функциям.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 ответа
Из документа "Новые функции в C# 4":
Динамический поиск не сможет найти методы расширения. Применим ли методы расширения или нет, зависит от статического контекста вызова (то есть того, какие встречаются условия использования), и эта информация контекста в настоящее время не хранится как часть полезной нагрузки.
Это работы, которые я нахожу интересными, по крайней мере...
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();