2011-07-14 19 views
9

Mi answer a una de las preguntas en SO fue comentada por Valentin Kuzub, quien argumenta que al crear una propiedad mediante el compilador JIT la reflexión dejará de funcionar.Propiedad/Método en línea e impacto en la Reflexión

El caso es el siguiente:

class Foo 
{ 
    public string Bar { get; set; } 

    public void Fuzz<T>(Expression<Func<T>> lambda) 
    { 
    } 
} 

Fuzz(x => x.Bar); 

Fuzz función acepta una expresión lambda y utiliza la reflexión para encontrar la propiedad. Es una práctica común en MVC en extensiones HtmlHelper.

no creo que la reflexión dejará de funcionar incluso si la propiedad se Bar inline, ya que es una llamada a Bar que ser inline y typeof(Foo).GetProperty("Bar") todavía devolverá un PropertyInfo válida.

¿Podría confirmar esto por favor o mi comprensión del método de alineación es incorrecta?

+0

Btw Encontré este interesante artículo que muestra otras razones para no usar lambdas en implementaciones de INotifyPropertyChange http://blog.quantumbitdesigns.com/2010/01/26/mvvm-lambda-vs-inotifypropertychanged-vs-dependencyobject/ –

Respuesta

3

El compilador JIT funciona en tiempo de ejecución y no puede reescribir la información de metadatos almacenada en el ensamblaje. Y la reflexión lee el ensamblaje para acceder a estos metadatos. Entonces, no hay impacto del compilador JIT en la reflexión.

EDIT: En realidad, hay un par de lugares en los que el compilador C# "en línea" parte de la información durante la compilación. Por ejemplo, las constantes, las enumeraciones y los argumentos predeterminados están "en línea", por lo que no puede acceder a ellos durante la reflexión. Pero definitivamente no está relacionado con su caso particular.

+0

What ¿te refieres a propiedades predeterminadas? – leppie

+0

Me refiero a los argumentos predeterminados, lo siento. Edité mi respuesta. –

+0

Puede agregar 'enums' a su lista. –

0

estoy muy de acuerdo con @Sergey:

Teniendo en cuenta que la expansión en línea que pasa por el lado del compilador JIT, pero metadatos generados antes, no debe INPACT en la reflexión de ninguna manera. Por cierto, buena pregunta, al igual que 1

1

Sí, cuando pienso en ello interfaz más supongo única manera propiedades procesos en línea podría fallar INotifyPropertyChanged trabajo correcta sería si estuviera utilizando un método basado en la reflexión utilizada como

public Count 
{ 
get {return m_Count;} 
set { m_Count=value; 
     GetCurrentPropertyNameUsingReflectionAndNotifyItChanged();} 
} 

Si se usa como usted sugiere, los metadatos existen en el ensamblado y el nombre de la propiedad se tomará con éxito desde allí.

Nos hizo pensar a los dos.

+0

Todavía creo que funcionará incluso en este caso. –

+0

¿cómo exactamente?Se llamará método no de propiedad, sino del método que usa propiedad, y el nombre del resultado no será Count, sino algo diferente (muy probablemente un nombre de método, en lugar de nombre de propiedad) –

+0

¿Su método 'GetCurrentPropertyNameUsingReflectionAndNotifyItChanged' analiza la pila de llamadas ? –

0

Los árboles de expresiones no se pueden alinear de todos modos ya que son una representación de la expresión (árbol de sintaxis abstracta) en lugar de la expresión en sí misma.

Los delegados, incluso si pueden alinearse, seguirán llevando los datos sobre el método y el destino al que se llama en sus propiedades.

Cuestiones relacionadas