2011-07-31 8 views
5

Estoy intentando ampliar la clase Página para agregar algunas nuevas funcionalidades (facilidad de uso para algunos métodos, ya que se llamarán directamente dentro del código de esa página) en ASP.NET, e I ' m recibiendo un error extraño:Extraño problema del método de extensión con la herencia

Mi método se llama SetQuery,
si escribo SetQuery en una clase de página, no se reconoce (sí, he añadido using [Namespace];),
si escribo base.SetQuery se ve en IntelliSense, pero no compila diciendo que no hay ningún método o método de extensión realmente encontrado en la página,
si escribo (this as Page).SetQuery es reconocido y funciona.

Especialmente el segundo caso parece ser un error para mí, ya que IntelliSense lo reconoce como un método de extensión, pero sin compilación.

¿Hay alguna forma "más natural" de escribir SetQuery sobre la marcha, sin moldes, etc.?

Respuesta

9

Métodos de extensión siempre requieren un objeto de destino (explícito), por lo que es imposible llamar a un método de extensión a través de TheMethodName(). Sospecho que si escribe:

this.SetQuery(); 

funcionará. Hay nunca implícita this. con métodos de extensión. Extraño pero cierto.

Lo anterior explica por qué SetQuery() no funciona; base.SetQuery() no funcionará, ya que el método de extensión se define para Page, no para la clase base. (this as Page).SetQuery() va a trabajar para las mismas razones que this.SetQuery(), de hecho, desde this as Page es obviamente cierto, el compilador tratará como un no-op - es decir, this.SetQuery() y (this as Page).SetQuery() debería generar el mismo IL (siempre y cuando la página real no lo hace tiene un método más específico SetQuery(), obviamente).

+0

Entiendo, creo que aunque he usado bastante los métodos de extensión, nunca los he llamado dentro de esa clase. Pero todavía parece ser un error para mí que intellisense muestre el método, pero no compila cuando lo escribo/lo selecciono de intellisense, quejándose de que no se encuentra. –

+0

@can sí, eso hace herida como un error intellisense - de acuerdo –

+0

FYI: Eso es solo para C#. En VB puedes usar esto implícitamente. –

Cuestiones relacionadas