2008-11-03 15 views
42

Estoy listening to a talk acerca de C# 4dynamic palabra clave y me pregunto ... ¿Esta característica será ortogonal a otras características de .NET, por ejemplo, admitirá métodos de extensión?¿La palabra clave dinámica en C# 4 es compatible con los 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 C# 4 fue enviado, que es por eso que se expresó en el tiempo futuro.

+0

pregunta impresionante. My Guess es "No" ya que no son realmente parte de la clase, y no están disponibles a través de la reflexión. – TheSoftwareJedi

+0

También supongo que "no". Pero creo que esto funcionaría: var x = "Y0"; x.twice(); –

+0

Joel, esto ya está funcionando. Cambiarlo sería un cambio radical – Olmo

Respuesta

47

Desde el "New Features in C# 4" word doc:

dinámicas de búsqueda no será capaz de métodos de extensión hallazgo. Si métodos de extensión se aplican o no depende en el contexto estático de la llamada (es decir, qué cláusulas de uso se producen) y esta información de contexto no es actualmente guardada como parte de la carga útil.

+1

Bueno, eso fue raro ... Esto de repente pasó de tres respuestas a una. Supongo que al eliminar mi respuesta incorrecta, el otro eliminó su "respuesta no del todo correcta" ... –

+1

jon, en una oración corta (solo para entender) ¿cuál es la razón exacta por la que dynamic doesnt no admite el método de extensión? –

+0

@RoyiNamir La magia de los métodos de extensión parece ser una construcción en tiempo de compilación. En el tiempo de ejecución, C# no transmite el estado de cada método de extensión que puede encontrar en el espacio de nombres, esto es un problema de rendimiento. – t3dodson

2

No funciona, los métodos de extensión funcionan dependiendo de tener el espacio de nombres incluido en el archivo y, hasta donde yo sé, MSIL no tiene idea de los archivos y espacios de nombres incluidos.

4

Esto funciona, 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); 

Sin embargo, si el compilador puede encontrar el método de extensión correcta en tiempo de compilación, entonces no veo por qué no puede empaquetar una conjunto de métodos de extensión para buscar en el tiempo de ejecución? Sería como una tabla v para métodos no miembros.

EDIT:

Esto es genial ... http://www2.research.att.com/~bs/multimethods.pdf

+0

Llamas a una clase estática y le das una cadena ... Eso siempre debería funcionar :) – NicoJuicy

1

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 llamarlo de esta manera:

ClassWithMyProp x; 
x.MyExt(); 
Cuestiones relacionadas