¿Qué significa esto: ExpressionFuncTModel, TValue

7

En ASP.Net MVC, en la vista de la maquinilla de afeitar, puede escribir este tipo de código:

@Html.EditorFor(model => model.Name)

(en este caso, crea un cuadro de texto para el campo Nombre del objeto que se define como el tipo del modelo)

Ahora cuando veo la definición del método EditorFor, es esto:

EditorFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression);

Así que intenté implementar ese tipo de método yo mismo, pero realmente no veo lo que esto significa Expression<Func<TModel, TValue>>

¿Quién puede explicarme qué es una expresión, y el Func y la expresión del tipo Func?

Las explicaciones que encontré en lugares tan abstractos que no me dieron una pista ...

    
pregunta Michel 16.01.2013 - 09:45

4 respuestas

7

La clase Expression<T> :

  

Representa una expresión lambda fuertemente tipada como una estructura de datos en forma de árbol de expresiones.

And :

  

El espacio de nombres System.Linq.Expressions contiene clases, interfaces y enumeraciones que permiten que las expresiones de código de nivel de idioma se representen como objetos en forma de árboles de expresión.

     

La clase abstracta Expression proporciona la raíz de una jerarquía de clases utilizada para modelar árboles de expresión.

     

Las clases en este espacio de nombres que se derivan de Expression, por ejemplo, MemberExpression y ParameterExpression , se usan para representar nodos en un árbol de expresiones. La clase Expression contiene métodos de fábrica estáticos (Compartidos en Visual Basic) para crear nodos de árbol de expresión de los diversos tipos.

     

El tipo de enumeración ExpressionType especifica los tipos de nodo únicos.

El Func<TResult> (y familia) de los delegados:

  

Puede usar este delegado para representar un método que se puede pasar como un parámetro sin declarar explícitamente un delegado personalizado. El método encapsulado debe corresponder a la firma del método definida por este delegado.

La familia básicamente encapsula delegados para funciones que tienen un valor de retorno.

Tomadas en conjunto, estas son expresiones que toman la función de los delegados tecleados, toman un parámetro del tipo de modelo y devuelven el valor que devuelve la lambda.

    
respondido por el Oded 16.01.2013 - 09:52
3

Expresión es una clase que le permite tomar una expresión lambda y transformarla en un árbol de sintaxis. Es utilizado por Linq (por ejemplo) para convertir las consultas de Linq en consultas de SQL reales. Es altamente extensible, por lo que podría hacer otras cosas con él.

enlace

Eche un vistazo a enlace si no está familiarizado con los AST's.

    
respondido por el doug65536 16.01.2013 - 10:38
2

Los Ayudantes de HTML utilizan un truco que se ha llamado "Reflexión estática" que se trajo al marco .NET para admitir LINQ to SQL y Entity Framework. Básicamente, la Expresión captura un Lambda que se verifica en tiempo de compilación (de ahí el Estático) en un árbol sintáctico. El árbol se puede caminar y puede dar cosas como el nombre del miembro al que hace referencia el cuerpo de la lambda.

Esencialmente, es una solución para la falta de .NET de una palabra clave "símbolo" como la que admiten otros idiomas.

    
respondido por el Michael Brown 16.01.2013 - 14:33
2

En este ejemplo específico, el HTML generado se ve así:

<input class="text-box single-line" id="Name" name="Name" type="text" value="ActualName" />

Si el parámetro fuera solo un Func , podría obtener el valor ActualName , pero no el nombre de la propiedad a la que está accediendo ( Name ). Por lo tanto, para obtener ese nombre, lo necesitaría como parámetro string (por ejemplo, algo como @Html.EditorFor(model => model.Name, "Name") ).

Esto no está bien, porque significa que debe ingresar el nombre de la propiedad dos veces. Peor aún, pierde la seguridad en tiempo de compilación: si el nombre de la propiedad cambia, no obtendrá un error en el segundo parámetro.

    
respondido por el svick 16.01.2013 - 14:53

Lea otras preguntas en las etiquetas