2011-03-11 21 views
22

Estoy leyendo el libro 'C# en profundidad, segunda edición' de Jon Skeet. Dijo que podemos llamar a los métodos de extensión con argumentos dinámicos utilizando dos soluciones, al igual que¿Cómo llamar a un método de extensión de un tipo dinámico?

dynamic size = 5; 
var numbers = Enumerable.Range(10, 10); 
var error = numbers.Take(size); 
var workaround1 = numbers.Take((int) size); 
var workaround2 = Enumerable.Take(numbers, size); 

Luego dijo "Ambos enfoques funcionan si desea llamar al método de extensión con el valor dinámico como el implícito valor this" . No sé cómo lograrlo.

Muchas gracias.

+11

Hombre, ¿ahora no es solo el boleto? Lees un libro de Jon Skeet y obtienes una respuesta de Jon Skeet sobre algo en lo que no estás seguro. –

+4

¿Necesitamos una etiqueta jon-skeet? – Myster

Respuesta

38

De esta manera:

dynamic numbers = Enumerable.Range(10, 10); 
var firstFive = Enumerable.Take(numbers, 5); 

En otras palabras, así como llamar a un método estático en lugar de como un método de extensión.

O si usted conoce a un argumento de tipo apropiado puede simplemente echarlo, que normalmente lo haría con una variable adicional:

dynamic numbers = Enumerable.Range(10, 10); 
var sequence = (IEnumerable<int>) numbers; 
var firstFive = sequence.Take(5); 

... pero si usted está tratando con tipos dinámicos , es posible que no sepas el tipo de elemento de secuencia, en cuyo caso la primera versión permite que el "compilador del tiempo de ejecución" lo resuelva, básicamente.

+1

, presumiblemente, podría hacer: (Números (IEnumerable )). ¿Tomar (5)? – Massif

+1

@Massif: Sí, podrías hacer eso también. Editaré –

3

Método de extensión solo un azúcar sintáctico, se convertirá como un método normal llamando al compilador C#. Esta conversión depende del contexto de sintaxis actual (¿Qué espacios de nombres se importan mediante la instrucción using?).

La variable dinámica es procesada por el tiempo de ejecución. esta vez, CLR no puede obtener suficiente información de contexto de sintaxis para decidir qué método de extensión usar. Entonces, no es trabajo.

Cuestiones relacionadas