¿La palabra clave dinámica en C # 4 admitirá métodos de extensión?
-
06-07-2019 - |
Pregunta
Soy escuchando una charla sobre la palabra clave dinámica
de C # 4 y me pregunto ... ¿Esta característica será ortogonal a otra? NET, por ejemplo, ¿admitirá métodos de extensión?
public static class StrExtension {
public static string twice(this string str) { return str + str; }
}
...
dynamic x = "Yo";
x.twice(); // will this work?
Nota: esta pregunta se hizo antes de que se enviara C # 4, razón por la cual está redactada en tiempo futuro.
Solución
Del " Nuevas características en C # 4 " word doc :
La búsqueda dinámica no podrá encontrar métodos de extensión Ya sea los métodos de extensión se aplican o no dependen en el contexto estático de la llamada (es decir, qué cláusulas de uso ocurren), y esta información de contexto no es actualmente mantenido como parte de la carga útil.
Otros consejos
Esto funciona lo que me parece interesante al menos ...
public static class StrExtension
{
public static string twice(this string str) { return str + str; }
}
...
dynamic x = "Yo";
StrExtension.twice(x);
Aún así, si el compilador puede encontrar el método de extensión correcto en el momento de la compilación, entonces no veo por qué no puede empaquetar un conjunto de métodos de extensión para buscar en tiempo de ejecución. Sería como una tabla v para métodos que no son miembros.
EDITAR:
Esto es genial ... http: //www2.research.att. com / ~ bs / multimethods.pdf
No puede funcionar, los métodos de extensión funcionan dependiendo de que el espacio de nombres esté incluido en el archivo y, que yo sepa, MSIL no tiene idea de los archivos ni de los espacios de nombres.
Puede crear un método de extensión para objeto y asignarlo a una dinámica :
public static void MyExt(this object o) {
dynamic d = o;
d.myProp = "foo";
}
y llámalo así:
ClassWithMyProp x;
x.MyExt();