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.

¿Fue útil?

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();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top