Будет ли ключевое слово dynamic в C # 4 поддерживать методы расширения?

StackOverflow https://stackoverflow.com/questions/258988

Вопрос

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();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top